Tyring在sql中使用pivot

时间:2017-11-03 15:20:45

标签: sql sql-server tsql

我有一张包含以下数据的表格:

从mytbl中选择MorningOrAfternoon,Emp,Meeting_Date,location_name

 MorningOrAfternoon Emp         Meeting_Date    location_name
 AM                 Charles J   20171103        Oss Office
 AM                 Charles J   20171104        NYC Office
 AM                 Charles J   20171104        BKLN Office
 AM                 Charles J   20171106        Oss Office
 AM                 Charles J   20171107        TT Office
 AM                 Charles J   20171108        Oss Office
 AM                 Charles J   20171109        WP Office

我的查询:

select Emp, 'AM' as Time,  day_1 , day_2, day_3, day_4,day_5 day_6, day_7  
from
(

    select t.Emp, t.Meeting_Date, t.location_name, rn='day_'+convert(nvarchar(10),row_number() over (partition by t.Emp order by t.Meeting_Date)) 
        from  mytbl t join
            (                   
                select Meeting_Date, Emp from mytbl where MorningOrAfternoon = 'AM'
                group by Meeting_Date, Emp
                having count(location_name ) < 2
            )a
    on a.Meeting_Date = t.Meeting_Date and a.Emp = t.Emp
    where t.MorningOrAfternoon = 'AM'

) as x
pivot (max(location_name) for [rn] in (day_1, day_2, day_3, day_4, day_5, day_6, day_7) ) p
order by Emp

产生以下结果:

Emp     Time    day_1       day_2       day_3       day_4       day_6       day_7
Charles J   AM  Oss Office  NULL        NULL        NULL        NULL        NULL
Charles J   AM  NULL        Oss Office  NULL        NULL        NULL        NULL
Charles J   AM  NULL        NULL        TT Office   NULL        NULL        NULL
Charles J   AM  NULL        NULL        NULL        Oss Office  NULL        NULL
Charles J   AM  NULL        NULL        NULL        NULL        WP Office   NULL

我想使用一个数据透视来创建此输出:

Emp         Time    day_1       day_2           day_3       day_4       day_5   day_6       day_7
Charles J   AM      Oss Office  Oss OfficeNULL  TT Office   Oss Office  Open    WP Office   Open

2 个答案:

答案 0 :(得分:0)

试试这个:

select Emp, 'AM' as Time,  day_1 , day_2, day_3, day_4,day_5 day_6, day_7  
from
(

    select t.Emp, t.location_name, rn='day_'+convert(nvarchar(10),row_number() over (partition by t.Emp order by t.Meeting_Date)) 
        from  mytbl t join
            (                   
                select Meeting_Date, Emp from mytbl where MorningOrAfternoon = 'AM'
                group by Meeting_Date, Emp
                having count(location_name ) < 2
            )a
    on a.Meeting_Date = t.Meeting_Date and a.Emp = t.Emp
    where t.MorningOrAfternoon = 'AM'

) as x
pivot (max(location_name) for [rn] in (day_1, day_2, day_3, day_4, day_5, day_6, day_7) ) p
order by Emp

由于Meeting_Date对于每一行都是唯一的,即使最终SELECT中没有PIVOTemp也会按SELECT列进行分组。所以,我们只需要从内部if answer in ('y','n'): 删除if。

答案 1 :(得分:0)

在不使用Pivot函数的情况下编写Pivots脚本的另一种方法:

select 
Emp
,'AM' as Time
,max(case when rn = 'day_1' then location_name) as day_1Location
,max(case when rn = 'day_2' then location_name) as day_2Location
...
from
(

    select t.Emp, t.Meeting_Date, t.location_name, rn='day_'+convert(nvarchar(10),row_number() over (partition by t.Emp order by t.Meeting_Date)) 
        from  mytbl t join
            (                   
                select Meeting_Date, Emp from mytbl where MorningOrAfternoon = 'AM'
                group by Meeting_Date, Emp
                having count(location_name ) < 2
            )a
    on a.Meeting_Date = t.Meeting_Date and a.Emp = t.Emp
    where t.MorningOrAfternoon = 'AM'

) as x
group by Emp