我正在尝试以数据透视格式获取简单的联接查询结果。
共享示例查询:
if object_id('tempdb.dbo.#t') is not null
drop table #t
create table #t (
EmpName nvarchar(1000),
CaseNumber nvarchar(1000),
[WeekDay] nvarchar(1000)
)
insert into #t values ('Sam','SM100','Monday')
insert into #t values ('Sam','SM100','Wednesday')
insert into #t values ('Sam','SM100','Thursday')
insert into #t values ('Peter','PT200','Monday')
insert into #t values ('Peter','PT200','Tuesday')
insert into #t values ('Peter','PT200','Wednesday')
insert into #t values ('Peter','PT200','Thursday')
insert into #t values ('Peter','PT200','Friday')
insert into #t values ('Peter','PT200','Saturday')
insert into #t values ('Peter','PT200','Sunday')
select * from #t
-- Expected output tabular format
通过John's查询...
;with cte as
(
Select *
From (Select *,Val=1 From #t) src
Pivot (sum(Val) for weekday in ([Sunday],[Monday],[Tuesday],[Wednesday],[Thursday],[Friday],[Saturday]) )pvt
)
select EmpName, CaseNumber,
Case When Sunday = 1 then 'Yes' when isnull(Sunday,'') = '' then 'No' end Sunday,
Case When Monday = 1 then 'Yes' when isnull(Monday,'') = '' then 'No' end Monday,
Case When Tuesday = 1 then 'Yes' when isnull(Tuesday,'') = '' then 'No' end Tuesday,
Case When Wednesday = 1 then 'Yes' when isnull(Wednesday,'') = '' then 'No' end Wednesday,
Case When Thursday = 1 then 'Yes' when isnull(Thursday,'') = '' then 'No' end Thursday,
Case When Friday = 1 then 'Yes' when isnull(Friday,'') = '' then 'No' end Friday,
Case When Saturday = 1 then 'Yes' when isnull(Saturday,'') = '' then 'No' end Saturday
from cte
我不希望使用过多的case语句...
答案 0 :(得分:4)
您可以使用条件聚合:
SELECT
EmpName,
MAX(CASE WHEN WeekDay = 'Sunday' THEN CaseNumber END) AS Sunday,
MAX(CASE WHEN WeekDay = 'Monday' THEN CaseNumber END) AS Monday,
MAX(CASE WHEN WeekDay = 'Tuesday' THEN CaseNumber END) AS Tuesday,
MAX(CASE WHEN WeekDay = 'Wednesday' THEN CaseNumber END) AS Wednesday,
MAX(CASE WHEN WeekDay = 'Thursday' THEN CaseNumber END) AS Thursday,
MAX(CASE WHEN WeekDay = 'Friday' THEN CaseNumber END) AS Friday,
MAX(CASE WHEN WeekDay = 'Saturday' THEN CaseNumber END) AS Saturday
FROM #t
GROUP BY EmpName
Demo on DB Fiddle 和示例数据:
EmpName | Sunday | Monday | Tuesday | Wednesday | Thursday | Friday | Saturday :------ | :----- | :----- | :------ | :-------- | :------- | :----- | :------- Peter | PT200 | PT200 | PT200 | PT200 | PT200 | PT200 | PT200 Sam | null | SM100 | null | SM100 | SM100 | null | null
答案 1 :(得分:2)
像这样吗?
示例
Select EmpName
,CaseNumber
,[Sunday] = IsNull([Sunday],'No')
,[Monday] = IsNull([Monday],'No')
,[Tuesday] = IsNull([Tuesday],'No')
,[Wednesday]= IsNull([Wednesday],'No')
,[Thursday] = IsNull([Thursday],'No')
,[Friday] = IsNull([Friday],'No')
,[Saturday] = IsNull([Saturday],'No')
From (Select *,Val='Yes' From #t) src
Pivot (max(Val) for weekday in ([Sunday],[Monday],[Tuesday],[Wednesday],[Thursday],[Friday],[Saturday]) )pvt
返回