Как получить SQL-запрос в сводном формате? - PullRequest
3 голосов
/ 29 марта 2019

Я пытаюсь получить результаты простого запроса соединения в сводном формате.

Обмен примером запроса:

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

С запрос Джона ...

;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

Я предпочитаю не использовать слишком много падежных выражений ...

Ответы [ 2 ]

4 голосов
/ 29 марта 2019

Можно использовать условное агрегирование :

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

Демонстрация на DB Fiddle с вашими данными выборки:

EmpName | Sunday | Monday | Tuesday | Wednesday | Thursday | Friday | Saturday
:------ | :----- | :----- | :------ | :-------- | :------- | :----- | :-------
Peter   | PT200  | PT200  | PT200   | PT200     | PT200    | PT200  | PT200   
Sam     | <em>null</em>   | SM100  | <em>null</em>    | SM100     | SM100    | <em>null</em>   | <em>null</em>    
3 голосов
/ 29 марта 2019

Как то так?

* ** 1003 тысяча два * Пример
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

Returns

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...