简体   繁体   English

Oracle SQL 计算每个月每周的天数

[英]Oracle SQL count days in week for every month

I have these two tables (times and sales):我有这两张表(时间和销售额):

times

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

sales销售量

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

I need to make columns for every day in week (Monday, Tuesday, Wednesday...) and SUM of AMOUNT_SOLD for each PROD_ID for each day for each month.我需要为一周中的每一天(星期一、星期二、星期三......)和每个月的每一天的每个 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

Output: Output:

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

but this sum all Wednesdays for all years, i need sum of amount for 1 month for all days (Wednesday, Monday...) for one month.但是这个所有年份的所有星期三的总和,我需要一个月的所有日子(星期三,星期一......)的金额总和。

Can you help me?你能帮助我吗?

You can do conditional aggregation:您可以进行条件聚合:

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

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM