【问题标题】:how to get a sql query in a pivot format?如何以数据透视格式获取 sql 查询?
【发布时间】:2023-03-04 23:20:01
【问题描述】:

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

分享示例查询:

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

【问题讨论】:

  • 也许你需要使用PIVOT

标签: sql sql-server database tsql pivot


【解决方案1】:

你可以使用条件聚合

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

【讨论】:

  • 谢谢.. 它有效.. 我不确定我们是否需要聚合函数
  • " 我不确定我们是否需要一个聚合函数" 如果你想保持数据库的可移植性@goofyui 我建议使用这个而不是使用PIVOT() .. 你只必须删除 # 才能将此查询移植到其他数据库供应商。
【解决方案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

退货

【讨论】:

  • 谢谢你.. 这很有帮助。而不是使用 val = 1,我可以在哪里通过应用 case when val = 1 then yes when isnull(val,'') = '' then no end - 只是为了保持是或否。而不是值
  • @goofyui 不确定您想要的结果应该是什么。但是您可以将 Val='Yes' 和 sum(Val) 更改为 max(Val)
  • @goofyui 总是乐于提供帮助:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-06-22
  • 2019-07-31
  • 1970-01-01
  • 2011-06-18
  • 1970-01-01
  • 2019-07-18
相关资源
最近更新 更多