【问题标题】:Fetch data based on month of a quarter in sql在sql中根据一个季度的月份获取数据
【发布时间】:2017-11-25 05:33:49
【问题描述】:

我有一张桌子:

Month      Data1    Data2

Jan-17       2       3
Feb-17       3       4
Mar-17       2       3
Apr-17       4       1
May-17       1       2

输出应该是:

Month    Data
Jan-17   Data2(Jan)+Data2(Feb)+Data2(Mar)(3+4+3)
Feb-17   Data1(Jan)+Data2(Feb)+Data2(Mar)(2+4+3)
Mar-17   Data1(Jan)+Data1(Feb)+Data2(Mar)(2+3+3)

季度从一月开始,如果月份是季度的第一个月,第一个月的输出应该是:第一个月的数据1+接下来两个月的数据2

如果月份是季度的第二个月,输出应该是上个月的Data1,第二个月的data2+第三个月的data2

如果月份是季度的第三个月,那么第三个月的输出应该是第一个月的Data1+第二个月的Data1+第三个月的Data2。

我正在使用 oracle 数据库。 有人可以帮忙吗。

【问题讨论】:

  • Month 列的数据类型是什么? .它是存储为字符还是您只显示了 DATE 的月份部分?
  • 我已经展示了日期的月份部分
  • 那么,在一个给定的月份会有多个条目还是只有一个条目?
  • 最初有多个条目,但我已经将它们分组,现在它们看起来有点像这样,每个月都有一个条目
  • @joe,对于“月份”列中具有“Apr-17”和“May-17”值的行,您期望什么结果?

标签: sql database oracle plsql


【解决方案1】:

您需要这样的查询。确保包含 NULL 在未来日期或过去日期的记录缺失时检查 Data1 、Data2 并在必要时将其默认为零。

select To_CHAR(Month,'MON-YY') Month,
        CASE 
                WHEN MOD ( EXTRACT ( MONTH FROM Month ), 3 ) = 1 
                THEN Data2 + LEAD ( Data2 ,1) OVER ( ORDER BY Month ) + LEAD ( Data2 ,2) OVER ( ORDER BY Month )
                WHEN MOD ( EXTRACT ( MONTH FROM Month ), 3 ) = 2 
                THEN LAG(Data1,1) OVER ( ORDER By Month ) + Data2 + LEAD ( Data2 ,1) OVER ( ORDER BY Month )
                WHEN MOD ( EXTRACT ( MONTH FROM Month ), 3 ) = 0 
                THEN LAG(Data1,2) OVER ( ORDER By Month ) + LAG(Data1,1) OVER ( ORDER By Month )+Data2
        END data
FROM 
        Table1;

SQLFiddle

【讨论】:

    猜你喜欢
    • 2023-03-14
    • 1970-01-01
    • 2018-06-18
    • 2019-05-15
    • 2020-04-28
    • 1970-01-01
    • 2020-11-16
    • 2020-07-23
    • 2023-01-28
    相关资源
    最近更新 更多