我正在尝试以数据透视格式获取简单的连接查询结果。
共享示例查询:
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 语句......
最佳答案
您可以使用条件聚合:
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 使用您的样本数据:
员工姓名 |星期日 |星期一 |星期二 |星期三 |星期四 |星期五 |周六
:------ | :----- | :----- | :------ | :-------- | :------- | :----- | :-------
彼得 | PT200 | PT200 | PT200 | PT200 | PT200 | PT200 | PT200
山姆 |空| SM100 |空| SM100 | SM100 |空|空值
关于sql - 如何以数据透视格式获取 sql 查询?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55407921/