使用 CTE 的动态日期透视

Posted

技术标签:

【中文标题】使用 CTE 的动态日期透视【英文标题】:Dynamic date pivot using CTE 【发布时间】:2020-07-06 10:19:38 【问题描述】:

我有一个经过大量计算得到的 CTE,所以最终的 CTE 包含三列 即“名称”、“值”和“日期”。 我搜索了谷歌,在所有 PIVOT 中,日期都是硬编码的,我不希望这些日期被硬编码,因为日期会动态更改。

有什么建议我可以通过 CTE 和动态日期轴获得这个结果吗?

版本 PostgreSQL 11 示例输入

Value.  Name          Date
"1" "Coenzym Q10"   "2020-06-29"
"1" "Coenzym Q10"   "2020-06-30"
"4" "Coenzym Q10"   "2020-07-01"
"1" "Coenzym Q10"   "2020-07-02"
"5" "Coenzym Q10"   "2020-07-03"
"1" "Coenzym Q10"   "2020-07-04"
"2" "D12"           "2020-07-01"
"4" "D12"           "2020-07-04"

期望的输出

"Name"        "2020-07-04".  "2020-07-03" "2020-07-02" "2020-07-01" "2020-06-30". "2020-06-29"
"Coenzym Q10".  "4"            "5"             "1"          "1"           "1"          "1"
"D12"           "4"                                         "2"

【问题讨论】:

"我不希望这些日期被硬编码,因为日期会动态更改" - 这是不可能的。 SQL 查询的列数,必须在数据库开始运行该语句之前知道。 @a_horse_with_no_name 那么我们如何通过动态日期获得这种结果,就像每天的日期都会向右移动,我只想显示过去 7 天的详细信息。还有其他方式吗? 【参考方案1】:

如果您不坚持将日期作为列名(标题),您可以执行以下操作:

select "Name", 
       max("Value") filter (where date = current_date) as "Today",
       max("Value") filter (where date = current_date - 1) as "Today -1",
       max("Value") filter (where date = current_date - 2) as "Today -2",
       max("Value") filter (where date = current_date - 3) as "Today -3",
       max("Value") filter (where date = current_date - 4) as "Today -4",
       max("Value") filter (where date = current_date - 5) as "Today -5",
       max("Value") filter (where date = current_date - 6) as "Today -6",
       max("Value") filter (where date = current_date - 7) as "Today -7"
from the_table
group by "Name"
order by "Name;

【讨论】:

以上是关于使用 CTE 的动态日期透视的主要内容,如果未能解决你的问题,请参考以下文章

SQL 动态数据透视表列顺序

如何使用动态数据透视表使一个月中的日期显示为列 - 明确提到月

c# 在 SQL 动态数据透视字符串中添加变量

按月透视 MySQL 中的数据

同步数据透视表 - VBA 代码不起作用

使用 VBA 将数据透视表设置为基于另一个字段的特定日期