【问题标题】:Oracle SQL count days in week for every monthOracle SQL 计算每个月每周的天数
【发布时间】:2020-06-19 23:17:44
【问题描述】:

我有这两张表(时间和销售额):

TIME_ID   |   DAY_NAME  |  DAY_NUMBER_IN_WEEK    |  CALENDAR_MONTH_NAME |  CALENDAR_MONTH_ID
1998-01-10|   Monday    |  1                     |  January             |  1684
1998-01-10|   Tuesday   |  2                     |  January             |  1684
1998-01-10|   Wednesday |  3                     |  January             |  1684
...
1998-01-11|   Monday    |  1                     |  February            |  1685
1998-01-11|   Tuesday   |  2                     |  January             |  1685
1998-01-11|   Wednesday |  3                     |  January             |  1685

销售

PROD_ID   |  TIME_ID     |  AMOUNT_SOLD
13        |  1998-01-10  |  1232          
13        |  1998-01-11  |  1233 
14        |  1998-01-11  |  1233

我需要为一周中的每一天(星期一、星期二、星期三...)和每个月的每一天的每个 PROD_ID 的 AMOUNT_SOLD 的总和创建列。

SELECT SUM(times.day_number_in_week), times.calendar_month_name, times.day_name, times.calendar_year
FROM sales
INNER JOIN times  ON times.time_id = sales.time_id
GROUP BY times.calendar_month_number, times.calendar_month_name, times.day_name, times.calendar_year

输出:

5988    March   Wednesday   1998
9408    April   Thursday    1998
7532    June    Sunday  1998
9220    July    Thursday    1998
7490    July    Sunday  1998
12540   August  Saturday    1998

但是所有年份的所有星期三的总和,我需要一个月的所有日期(星期三,星期一...)的 1 个月的总和。

你能帮帮我吗?

【问题讨论】:

    标签: sql oracle join group-by sum


    【解决方案1】:

    你可以做条件聚合:

    SELECT 
        t.calendar_year
        t.calendar_month_name, 
        SUM(case when t.day_number_in_week = 1 then s.amount_sold else 0 end) amount_sold_mon,
        SUM(case when t.day_number_in_week = 2 then s.amount_sold else 0 end) amount_sold_tue,
        SUM(case when t.day_number_in_week = 3 then s.amount_sold else 0 end) amount_sold_wed,
        ...
    FROM sales s
    INNER JOIN times t ON t.time_id = sales.time_id
    GROUP BY t.calendar_year, t.calendar_month_number, t.calendar_month_name
    

    【讨论】:

    • SELECT times.calendar_year_id, times.calendar_month_id, SUM(times.day_number_in_week = 1 然后 sales.amount_sold 否则 0 end) amount_sold_mon, SUM(times.day_number_in_week = 2 然后是 sales 的情况.amount_sold else 0 end) amount_sold_tue, SUM(case when times.day_number_in_week = 3 then sales.amount_sold else 0 end) amount_sold_wed FROM sales INNER JOIN times ON times.time_id = sales.time_id GROUP BY times.calendar_year_id, times.calendar_month_id, times .day_number_in_week 工作,但我需要为特定的 prod_id 计算它
    • @H.Ivanov:只需添加一个where 子句,过滤您想要结果的prod_id
    • 工作完美,但我需要从 SUM 函数中删除所有 0 我该怎么做?我尝试使用 HAVING 但不工作...你能帮帮我吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-26
    • 1970-01-01
    • 2018-12-03
    • 2015-01-31
    • 1970-01-01
    相关资源
    最近更新 更多