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 中的数据透视表的主要内容,如果未能解决你的问题,请参考以下文章