我有一张包含以下数据的表格:
从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
答案 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
中没有PIVOT
,emp
也会按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