首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >动态和多列上的动态透视

动态和多列上的动态透视
EN

Stack Overflow用户
提问于 2015-12-01 18:16:48
回答 1查看 75关注 0票数 0

我正在尝试对SQL Server 2012中的多个列执行动态透视

我的表格如下

代码语言:javascript
复制
customer UnitNo  invoiceNo  invDate    heads   Amt periodFrmDT  periodToDT  
abc      GF-3    C0000001  2015-11-01 Charge1  100 2015-11-01   2015-11-30  
abc      GF-3    C0000001  2015-11-01 Charge2  500 2015-11-10   2015-12-10  
abc      GF-3    C0000001  2015-11-01 charge3  600 2015-10-01   2015-10-30  

我想要下面这样的结果

代码语言:javascript
复制
customer unitNo invoiceNo   invDate    Charge1  PeriodFrmDT periodToDT  Charge2  PeriodFrmDT    periodToDT  Charge3  PeriodFrmDT periodToDT

abc      GF-3   C0000001    2015-11-01  100     2015-11-01  2015-11-30  500      2015-11-10   2015-12-10    600     2015-10-01   2015-10-30

我已经试过了

代码语言:javascript
复制
 select * from (
    select c.Customer,unitNo, ih.invoiceNo
    ,bh.heads,it.Amt,periodFrmDT,PeriodToDT
    from invHeader ih
                inner join customer c on c.custID =ih.custID
                inner join mstUnit mu on mu.unitID=ih.unitID
                inner join invTran it on it.invID=ih.invHeaderID
                inner join billingHeads bh on bh.BillHeadID=it.headID           
    )P 
    Pivot 
    (
     max(amt)         
     for Head in([charge1],[charge2],[charge3])      
    ) as pvt

请帮帮我..

EN

回答 1

Stack Overflow用户

发布于 2015-12-01 19:14:25

这将为您提供您指定的表。这里的关键是,您必须首先取消透视每个费用的金额、开始日期和结束日期。然后,这允许您重新旋转并查看所有3个值。

首先,我伪造了你的数据如下:

代码语言:javascript
复制
declare @cte table (customer nvarchar(4)
        , UnitNo nvarchar(4)
        , invoiceNo nvarchar(8)
        , invDate datetime
        , heads nvarchar(8)
        , Amt int 
        , periodFrmDT datetime
        , periodToDT  datetime)
insert into @cte ( customer, UnitNo,  invoiceNo,  invDate,    heads,   Amt, periodFrmDT,  periodToDT)
values 
('abc',      'GF-3',    'C0000001',  '2015-11-01', 'Charge1',  100, '2015-11-01',   '2015-11-30'), 
('abc',      'GF-3',    'C0000001',  '2015-11-01', 'Charge2',  500, '2015-11-10',   '2015-12-10'),  
('abc',      'GF-3',    'C0000001',  '2015-11-01', 'charge3',  600, '2015-10-01',   '2015-10-30');

然后,我使用以下查询来获取您所请求的数据:

代码语言:javascript
复制
with mycte as (select * from @cte
               )
select * from 
    (
    select customer, UnitNo  ,invoiceNo  ,invDate, heads + '_' + columnname as heads, value 
    from (select customer, UnitNo, invoiceNo, invDate, heads
               , cast(Amt as nvarchar(10)) as Amt
               , left(convert(nvarchar(10), periodFrmDT, 120), 10) as periodFrm
               , left(convert(nvarchar(10), periodToDT, 120), 10)  as periodTo 
          from mycte
          ) as t1
    unpivot(value for columnname in (Amt, periodFrm ,periodTo)) as t2
    ) as t3 -- this table gives you your initial columns, then 2 more with the column headings for the next stage, and the values
            -- columnname contains [Charge1_Amt], [Charge1_periodFrm], [Charge1_periodTo] etc
pivot (min(value) for heads in ( [Charge1_Amt], [Charge1_periodFrm], [Charge1_periodTo]
                               , [Charge2_Amt], [Charge2_periodFrm], [Charge2_periodTo]
                               , [charge3_Amt] , [charge3_periodFrm], [charge3_periodTo]
                               )
       ) as t4 -- And then we can re-pivot it all back up again.

要直接从您的数据使用第二个查询,请替换

代码语言:javascript
复制
with mycte as (select * from @cte
               )

使用

代码语言:javascript
复制
with mycte as (
    -- This is the query with your base data
    select c.Customer,unitNo, ih.invoiceNo, invDate ,bh.heads,it.Amt,periodFrmDT,PeriodToDT
    from invHeader ih
                inner join customer c on c.custID =ih.custID
                inner join mstUnit mu on mu.unitID=ih.unitID
                inner join invTran it on it.invID=ih.invHeaderID
                inner join billingHeads bh on bh.BillHeadID=it.headID   
               )
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34017844

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档