繁体   English   中英

在 sql 中查找两个透视列之间的差异

[英]To find difference between two pivoted columns in sql

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)

我已经尝试过这个脚本,但下一步是什么才能获得此处显示的所需输出:

图像包含数据它的外观以及异常结果是什么

  • 使您的主要查询嵌套和别名( t
  • 删除引号,保留日期文字的方括号以创建列名
  • 假设 Id 是整数值,也删除ID = '-3'引号
  • Date in ('2019-12-18', '2019-12-19')使用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

演示

从包含方括号中的in运算符之后的文字的查询格式中,我认为您的 DBMS 是SQL-Server

当只有 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
\n日期 | 身份证 |  id_count | 价钱    \n :------------------ |  ---: |  :------- |  :--------\n 18/12/2019 00:00:00 |  -3 |  1 |  94416.68 \n 19/12/2019 00:00:00 |  -3 |  1 |  31352.26 \n| | 结果 |  -63064.42\n

db<> 在这里摆弄

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM