SQL Server 2016 中的数据透视表

Posted

技术标签:

【中文标题】SQL Server 2016 中的数据透视表【英文标题】:Pivot table in SQL Server 2016 【发布时间】:2020-10-01 21:49:41 【问题描述】:

我在 SQL Server 2016 中透视表时遇到问题。请考虑以下数据/查询


WITH DATA1 AS
(
   SELECT 123 cid, 'test' cname, '2020-03-17' dt,   'BELLE' fc,     3782703 mn union all
  SELECT 123 cid, 'test' cname, '2020-03-12' dt,    'WOO' fc,       25679 mn union all

  SELECT 345 cid, 'test2' cname, '2019-03-17' dt,   'king' fc,      3782703 mn union all
  SELECT 345 cid, 'test2' cname, '2019-03-12' dt,   'east' fc,      25679 mn union all

  SELECT 111 cid, 'test3' cname, '2019-02-12' dt,   'east' fc,      2 mn
)
select *
 from DATA1
 PIVOT (
     MAX(mn)  FOR fc IN (
      [BELLE]   
      ,[WOO] 
      ,[KING]
      ,[EAST]  
       ) 
) a

我正在尝试以 dt 和 mn 为中心来获取 fc 中的值。所以基本上我正在寻找这个输出。

cid       cname    fc1_dt        fc1_name   fc1_mn    fc2_name   fc2_dt        fc2_mn   
123       test      2020-03-17   BELLE      3782703     woo        2020-03-12    25679
345       test2    2019-03-17    king       37          east       2019-03-12    25
111       test3     2019-02-12   east        2

我试图像这样添加到max 函数,但它不起作用

 PIVOT (
     MAX(mn),max(dt)  FOR fc IN (
      [BELLE]   
      ,[WOO] 
      ,[KING]
      ,[EAST]  
       ) 
) a

有人可以帮忙修改我的查询以产生上面的输出吗?

【问题讨论】:

【参考方案1】:

一个选项使用row_number() 和条件聚合。假设您想要第一列中的最新日期:

select cid, cname,
    max(case when rn = 1 then dt end) fc1_dt,
    max(case when rn = 1 then fc end) fc1_name,
    max(case when rn = 1 then mn end) fc1_mn,
    max(case when rn = 2 then dt end) fc2_dt,
    max(case when rn = 2 then fc end) fc2_name,
    max(case when rn = 2 then mn end) fc2_mn
from (
    select d.*, row_number() over(partition by cid, cname order by dt desc) rn
    from data1 d
) d
group by cid, cname

如果您希望每组处理超过 2 行,则需要使用更多条件表达式扩展 select 子句。

Demo on DB Fiddle

西德 |名称 | fc1_dt | fc1_name | fc1_mn | fc2_dt | fc2_name | fc2_mn --: | :---- | :--------- | :------- | ------: | :--------- | :------- | -----: 123 |测试 | 2020-03-17 |美女 | 3782703 | 2020-03-12 |呜 | 25679 345 |测试2 | 2019-03-17 |国王 | 3782703 | 2019-03-12 |东| 25679 111 |测试3 | 2019-02-12 |东| 2 | | |

【讨论】:

以上是关于SQL Server 2016 中的数据透视表的主要内容,如果未能解决你的问题,请参考以下文章

MS SQL Server 中的动态数据透视

SQL Server 数据库中的动态数据透视

SQL Server 中的复杂数据透视表

SQL Server 中的动态数据透视表

SQL Server 中的数据透视表查询

从 SQL Server DB 更新单独工作表中的数据后自动刷新 Excel 2007 数据透视表