sql - 如何以数据透视格式获取 sql 查询?

标签 sql sql-server database tsql pivot

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

共享示例查询:

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/

相关文章:

php/mysql 更新表并在未找到匹配项的情况下插入新记录

sql - 按增量 postgres 求和

PHP 准备语句 bind_param() 错误

c# - Entity Framework 两个查询结果相同,但一个更快

php - 建立数据库连接时出错 - WP 主机更改了密码

sql - MySQL 中是否有一个函数可以压缩查询返回的结果?

sql - 如何在 FORMSOF Inflectional 全文搜索中获取匹配项的位置?

c# - 选择多个 CSV 并批量写入数据库

mysql - 正向工程一些新关系在填充数据库中失败(errno 150)

database - 用于使用单个 RDS Mysql 在 4 个 ec2 实例上创建 wordpress 的 Cloudformation 模板