在 sql 中查找两个透视列之间的差异
Posted
技术标签:
【中文标题】在 sql 中查找两个透视列之间的差异【英文标题】:To find difference between two pivoted columns in sql 【发布时间】:2019-12-25 06:28:13 【问题描述】:select count(*) AS id_CNT, Date, price
from table
where Date in ('2019-12-18', '2019-12-19')
and Id = '-3'
group by Date, price
pivot
(max(price) for date in (['2019-12-18'], ['2019-12-19']) piv)
我已经尝试过这个脚本,但下一步是如何获得此处显示的所需输出:
【问题讨论】:
【参考方案1】: 让你的主查询嵌套和别名(t
)
删除引号,为日期文字保留方括号以创建列名
假设 Id 为整数值,同时删除 ID = '-3'
的引号
使用Date in ('2019-12-18', '2019-12-19')
是多余的,所以摆脱
其中
旋转部分的别名应该在右括号之后
所以,使用这个查询:
SELECT piv.*, [2019-12-19] - [2019-12-18] as Diff
FROM
(
SELECT ID, Date, Price, COUNT(*) AS ID_Cnt
FROM tab
WHERE ID = -3
GROUP BY ID, Date, price
) t
PIVOT
(
MAX(Price) for Date in ( [2019-12-18], [2019-12-19] )
) piv
Demo
从包含 in
运算符后的文字方括号的查询格式来看,我想您的 DBMS 是 SQL-Server。
【讨论】:
【参考方案2】:当只有 2 个日期时,您实际上并不需要 PIVOT 然后 UNPIVOT 来获得最终结果。
样本数据:
create table YourTable ( Id int not null, [Date] date not null, price decimal(16,2) not null ) insert into YourTable (id, [date], price) values (-3, '2019-12-18', 94416.68), (-3, '2019-12-19', 31352.26);
查询:
日期 |身份证 | id_count |价格 :----------------- | ---: | :------- | :-------- 18/12/2019 00:00:00 | -3 | 1 | 94416.68 19/12/2019 00:00:00 | -3 | 1 | 31352.26 空 | 空 |结果 | -63064.42WITH CTE_DATA AS ( SELECT Id, [Date] , id_count = COUNT(*) , price = SUM(price) , rn = ROW_NUMBER() OVER (PARTITION BY Id ORDER BY [Date] DESC) FROM YourTable WHERE Id = -3 AND [Date] IN ('2019-12-18', '2019-12-19') GROUP BY Id, [Date] ) SELECT [Date], Id , CAST(id_count AS VARCHAR(30)) AS id_count , price FROM CTE_DATA UNION ALL SELECT null, null, 'Result' , (MAX(CASE WHEN rn=1 THEN price END) - MAX(CASE WHEN rn=2 THEN price END)) FROM CTE_DATA GROUP BY Id ORDER BY Id desc, [Date] GO
db小提琴here
【讨论】:
以上是关于在 sql 中查找两个透视列之间的差异的主要内容,如果未能解决你的问题,请参考以下文章