如何获取数据透视格式的SQL查询?

时间:2019-03-28 22:42:19

标签: sql sql-server

我正在尝试以数据透视格式获取简单的联接查询结果。

共享示例查询:

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语句...

2 个答案:

答案 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

返回

enter image description here