在 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);

查询:

WITH 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
日期 |身份证 | id_count |价格 :----------------- | ---: | :------- | :-------- 18/12/2019 00:00:00 | -3 | 1 | 94416.68 19/12/2019 00:00:00 | -3 | 1 | 31352.26 | |结果 | -63064.42

db小提琴here

【讨论】:

以上是关于在 sql 中查找两个透视列之间的差异的主要内容,如果未能解决你的问题,请参考以下文章

在 Python 中获取数据透视表列之间的差异

SQL查询以查找列的行值之间的最小差异

在 pyspark sql 中查找两个时间戳之间的差异

查找两个日期之间的差异 Oracle SQL

我正在尝试提高查找两个表之间差异的 Oracle SQL 的性能

使用python查找两个csv文件列之间的差异