如何创建基于当前日期/月份动态更改列顺序的 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
Google 70 30 20 ... 80
Amazon 30 45 34 ... 24
...

它包含每个公司在该特定月份内所有客户的信用。

我只想跟踪过去 12 个月的情况(该表每月更新一次)。 在 2022 年 1 月,我希望列顺序更改如下:

Company name January 2022 December 2021 November 2021 ... February 2021
Google 25 70 30 ... 14
Amazon 80 30 45 ... 33
...

2022 年 2 月将发生变化:

Company name February 2022 January 2022 December 2021 ... January 2021
Google 37 25 70 ... 20
Amazon 42 80 30 ... 21
...

假设我可以从具有以下结构的表中检索信用值:

Company name Month Value
Google December 2021 70
Amazon December 2021 30
Google November 2021 30
Amazon November 2021 45
...

你知道如何在 SQL 中做到这一点吗?

【问题讨论】:

存储所有数据和所有月份不是更好,然后根据当前月份的数据编写正确的选择吗?刚刚-12个月。否则,您需要编写每个月开始工作时的触发器或程序 - 它删除上个月并添加新的 您是否真的有一个表,每个月都有一个列 - 如果有,有多少列,跨越多少年 - 或者您实际上是在查看一个更易于管理的表与一行的透视视图每月(或每月多行,并且视图在月级别聚合)?您现有表/视图的 DDL 会有所帮助;就像展示你现在如何“检索信用值”一样...... 这将是一个非常糟糕和痛苦的设计。 B更好地将数据存储在记录中。 @AlexPoole 第二个选项 :) 我在帖子中添加了源表的结构,希望对你有帮助! 您需要的大部分内容都可以在标准 SQL 中完成。如果您想根据当前日期动态显示过去 12 个月,这可以轻松完成。不能轻易做到的是动态更改列names。您要么需要动态 SQL(最好通过您的报告工具来实现,而不是编写自己的动态代码),或者您可以使用通用列名,如“上个月”、“两个月前”等。 【参考方案1】:

假设您有一个存储有日期(即一个月中的某一天,例如一个月的最后一天)的表格:

Company Month Value
Google 2021-06-30 70
Amazon 2021-06-30 30
Google 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 表?的主要内容,如果未能解决你的问题,请参考以下文章

sql如何获取一列日期的年份和月份

SQL里把时间那列改成日期形式的

更改月份日历上的日期颜色

如何在 Oracle SQL 中使用月份作为日期列

交叉表查询中的日期顺序 - 使用单独的表进行排序

查询数据库以显示基于当前日期和月份的数据总数