如何创建基于当前日期/月份动态更改列顺序的 sql 表?
Posted
技术标签:
【中文标题】如何创建基于当前日期/月份动态更改列顺序的 sql 表?【英文标题】:How to create sql table that changes dynamically the order of the columns based on current date/month? 【发布时间】:2021-10-04 21:24:54 【问题描述】:我的目标是有一个具有以下结构的表:
Company name | December 2021 | November 2021 | October 2021 | ... | January 2021 |
---|---|---|---|---|---|
70 | 30 | 20 | ... | 80 | |
Amazon | 30 | 45 | 34 | ... | 24 |
... |
它包含每个公司在该特定月份内所有客户的信用。
我只想跟踪过去 12 个月的情况(该表每月更新一次)。 在 2022 年 1 月,我希望列顺序更改如下:
Company name | January 2022 | December 2021 | November 2021 | ... | February 2021 |
---|---|---|---|---|---|
25 | 70 | 30 | ... | 14 | |
Amazon | 80 | 30 | 45 | ... | 33 |
... |
2022 年 2 月将发生变化:
Company name | February 2022 | January 2022 | December 2021 | ... | January 2021 |
---|---|---|---|---|---|
37 | 25 | 70 | ... | 20 | |
Amazon | 42 | 80 | 30 | ... | 21 |
... |
假设我可以从具有以下结构的表中检索信用值:
Company name | Month | Value |
---|---|---|
December 2021 | 70 | |
Amazon | December 2021 | 30 |
November 2021 | 30 | |
Amazon | November 2021 | 45 |
... |
你知道如何在 SQL 中做到这一点吗?
【问题讨论】:
存储所有数据和所有月份不是更好,然后根据当前月份的数据编写正确的选择吗?刚刚-12个月。否则,您需要编写每个月开始工作时的触发器或程序 - 它删除上个月并添加新的 您是否真的有一个表,每个月都有一个列 - 如果有,有多少列,跨越多少年 - 或者您实际上是在查看一个更易于管理的表与一行的透视视图每月(或每月多行,并且视图在月级别聚合)?您现有表/视图的 DDL 会有所帮助;就像展示你现在如何“检索信用值”一样...... 这将是一个非常糟糕和痛苦的设计。 B更好地将数据存储在记录中。 @AlexPoole 第二个选项 :) 我在帖子中添加了源表的结构,希望对你有帮助! 您需要的大部分内容都可以在标准 SQL 中完成。如果您想根据当前日期动态显示过去 12 个月,这可以轻松完成。不能轻易做到的是动态更改列names。您要么需要动态 SQL(最好通过您的报告工具来实现,而不是编写自己的动态代码),或者您可以使用通用列名,如“上个月”、“两个月前”等。 【参考方案1】:假设您有一个存储有日期(即一个月中的某一天,例如一个月的最后一天)的表格:
Company | Month | Value |
---|---|---|
2021-06-30 | 70 | |
Amazon | 2021-06-30 | 30 |
2021-05-31 | 30 | |
Amazon | 2021-05-31 | 45 |
... | ... | ... |
Amazon | 2020-01-31 | 123 |
如果您想要过去 12 个月,您可以使用带有 PIVOT
子句或条件聚合的数据透视查询。我在以下查询中使用后者:
select
company,
sum(case when trunc(month, 'mm') = trunc(sysdate, 'mm') - interval '12' month then value end) as "12 months ago",
sum(case when trunc(month, 'mm') = trunc(sysdate, 'mm') - interval '11' month then value end) as "11 months ago",
...
sum(case when trunc(month, 'mm') = trunc(sysdate, 'mm') - interval '2' month then value end) as "2 months ago",
sum(case when trunc(month, 'mm') = trunc(sysdate, 'mm') - interval '1' month then value end) as "1 month ago"
from mytable
where month < trunc(sysdate, 'mm') and month >= trunc(sysdate, 'mm') - interval '12' month
group by company
order by company;
当在您的应用程序的网格中显示此结果时,您当然可以将列标题更改为相关月份。
【讨论】:
谢谢,你的解决方案解决了 :)以上是关于如何创建基于当前日期/月份动态更改列顺序的 sql 表?的主要内容,如果未能解决你的问题,请参考以下文章