【问题标题】:SQL - group & sum based on dateSQL - 根据日期分组和求和
【发布时间】:2014-06-02 04:28:01
【问题描述】:

我很少坚持使用 SQL 查询特定场景。

假设我们有以下数据

d1 - Date
d2 - Date
count - number
sum - number

    d1       d2   count     sum
20-May-14,20-May-14,117.00,201452.45
20-May-14,21-May-14,36.00,72966.37
20-May-14,22-May-14,23,30599.99
20-May-14,23-May-14,9.00,3012345.11
20-May-14,24-May-14,4,2750.46
20-May-14,25-May-14,2,2391.59
20-May-14,26-May-14,11.00,34625.52
20-May-14,27-May-14,2,2891.59
20-May-14,28-May-14,5,6188.79
21-May-14,21-May-14,84.00,192357.77
21-May-14,22-May-14,21,52805.22
21-May-14,23-May-14,13,27730.85
21-May-14,24-May-14,11.00,40361.32
21-May-14,25-May-14,4.00,7431.79
21-May-14,26-May-14,7.00,19903.92
21-May-14,27-May-14,4,6160.74
21-May-14,28-May-14,7.00,11905.57

我想按以下方式对数据进行分组和求和

  1. count & sum when d1=d2(在 d1 当天,例如:当 d1 = 20-May-14, d2 = 20-May-14)

  2. 当 d2=d1+1 时计数和求和(d1 的第二天,例如:当 d1 = 20-May-14、d2 = 21-May-14 时)

  3. 当 d2=d1+2 时计数和求和(d1 的第二天后,例如:当 d1 = 20-May-14,d2 = 22-May-14 时)

  4. 当 d2>d1+3 时计数和求和(总计 - 大于 d1 的第二天后,例如:当 d1 = 20-May-14, d2 >= 23-May-14)

我目前正在使用个别条件根据上述结果集查询一个非常大的数据库并手动合并结果。

是否可以查询数据并从表中获取结果作为以下合并信息:

d1,count(d2=d1),sum(d2=d1),count(d2=d1+1), sum(d2=d1+1), count(d2=d1+2),sum(d2=d1+2),count(d2>=d1+3),sum(d2>=d1+3)
20-May-14,117,201452.45,36,72966.37,23,30599.99,33,3061193.06
21-May-14,84,192357.77,21,52805.22,13,27730.85,33,85763.34

【问题讨论】:

  • 您的问题解决了吗?

标签: sql oracle oracle11g


【解决方案1】:

您好,您可以通过添加附加条件来扩展给定的查询,这应该可以。如果您遇到任何问题,请告诉我

select d1,SUM(case 
               when d1=d2 then cnt 
              end
           )  as count_d1_d2,
         SUM(case 
              when d1=d2 then sm 
             end
             ) as  SUM_d1_plus_d2,
         SUM(case 
               when d2=d1+1 then cnt 
              end
           )  as count_d1_d2_1,
         SUM(case 
              when d2=d1+1 then sm 
             end
             ) as  SUM_d1_d2_1

from test
group by d1

这里是Fiddle

【讨论】:

    【解决方案2】:

    我没有 oracle,所以我无法检查语法,但这里是大概的逻辑:

    select d1, least(d2-d1, 3) as type, count(*), sum(...)
    from table
    group by d1, least(d2-d1, 3)
    

    所以,这里的逻辑是计算日期之间的差异并按它分组

    覆盖我们最少使用 (d2>d1+3) 的分支

    【讨论】:

    • 我认为查询应该包含d1 作为第一个字段
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-09
    • 1970-01-01
    • 1970-01-01
    • 2018-08-01
    • 1970-01-01
    相关资源
    最近更新 更多