【问题标题】:four Weeks data - group by四个星期的数据 - 分组
【发布时间】:2015-07-05 23:26:28
【问题描述】:

我有以下表格及其各自的数据:

FORECAST:
- ITEM
- FORECAST_WEEK_DATE
- FORECAST

SALES:
- ITEM
- SALES_WEEK_DATE
- SALES

WEEK_DATE 列包含每个周末日期的记录,例如: 2015 年 7 月 2 日 2015 年 2 月 15 日 等等。

我想从两个表中获取结果,以便结果如下:

ITEM FORECAST_TOTAL SALES_TOTAL
001       23             45

最近 4 周的总数据。

我如何做到这一点?

【问题讨论】:

    标签: sql oracle date group-by


    【解决方案1】:

    SQL Fiddle

    Oracle 11g R2 架构设置:

    CREATE TABLE FORECAST ( ITEM, FORECAST_WEEK_DATE, FORECAST) AS
              SELECT 1, DATE '2015-01-01',                     1 FROM DUAL
    UNION ALL SELECT 1, DATE '2015-01-01' + INTERVAL  '7' DAY, 2 FROM DUAL
    UNION ALL SELECT 1, DATE '2015-01-01' + INTERVAL '14' DAY, 3 FROM DUAL
    UNION ALL SELECT 1, DATE '2015-01-01' + INTERVAL '21' DAY, 4 FROM DUAL
    UNION ALL SELECT 1, DATE '2015-01-01' + INTERVAL '28' DAY, 5 FROM DUAL
    UNION ALL SELECT 1, DATE '2015-01-01' + INTERVAL '35' DAY, 6 FROM DUAL
    UNION ALL SELECT 1, DATE '2015-01-01' + INTERVAL '42' DAY, 7 FROM DUAL
    UNION ALL SELECT 2, DATE '2015-01-01',                     3 FROM DUAL
    UNION ALL SELECT 2, DATE '2015-01-01' + INTERVAL  '7' DAY, 1 FROM DUAL
    UNION ALL SELECT 2, DATE '2015-01-01' + INTERVAL '14' DAY, 5 FROM DUAL
    UNION ALL SELECT 2, DATE '2015-01-01' + INTERVAL '21' DAY, 8 FROM DUAL
    UNION ALL SELECT 2, DATE '2015-01-01' + INTERVAL '28' DAY, 3 FROM DUAL
    UNION ALL SELECT 2, DATE '2015-01-01' + INTERVAL '35' DAY, 2 FROM DUAL;
    
    CREATE TABLE SALES (ITEM, SALES_WEEK_DATE, SALES) AS
              SELECT 1, DATE '2015-01-01',                     3 FROM DUAL
    UNION ALL SELECT 1, DATE '2015-01-01' + INTERVAL  '7' DAY, 2 FROM DUAL
    UNION ALL SELECT 1, DATE '2015-01-01' + INTERVAL '14' DAY, 1 FROM DUAL
    UNION ALL SELECT 1, DATE '2015-01-01' + INTERVAL '21' DAY, 5 FROM DUAL
    UNION ALL SELECT 1, DATE '2015-01-01' + INTERVAL '28' DAY, 3 FROM DUAL
    UNION ALL SELECT 1, DATE '2015-01-01' + INTERVAL '35' DAY, 8 FROM DUAL
    UNION ALL SELECT 1, DATE '2015-01-01' + INTERVAL '42' DAY, 11 FROM DUAL
    UNION ALL SELECT 2, DATE '2015-01-01',                     7 FROM DUAL
    UNION ALL SELECT 2, DATE '2015-01-01' + INTERVAL  '7' DAY, 1 FROM DUAL
    UNION ALL SELECT 2, DATE '2015-01-01' + INTERVAL '14' DAY, 4 FROM DUAL
    UNION ALL SELECT 2, DATE '2015-01-01' + INTERVAL '21' DAY, 3 FROM DUAL
    UNION ALL SELECT 2, DATE '2015-01-01' + INTERVAL '28' DAY, 6 FROM DUAL
    UNION ALL SELECT 2, DATE '2015-01-01' + INTERVAL '35' DAY, 8 FROM DUAL;
    

    查询 1:

    这将在表格中为每个项目获取最近 4 周的数据:

    WITH ordered_week_data AS (
    SELECT f.ITEM,
           ROW_NUMBER() OVER ( PARTITION BY f.ITEM ORDER BY FORECAST_WEEK_DATE DESC ) AS RN,
           f.FORECAST_WEEK_DATE AS WEEK_DATE,
           FORECAST,
           SALES
    FROM   FORECAST f
           INNER JOIN
           SALES s
           ON ( f.ITEM = s.ITEM AND f.FORECAST_WEEK_DATE = s.SALES_WEEK_DATE )
    )
    SELECT ITEM,
           MAX( WEEK_DATE ) AS LAST_WEEK_DATE,
           SUM( FORECAST ) AS FORECAST_TOTAL,
           SUM( SALES ) AS SALES_TOTAL
    FROM   ordered_week_data
    WHERE  RN <= 4
    GROUP BY
           ITEM
    

    Results:

    | ITEM |             LAST_WEEK_DATE | FORECAST_TOTAL | SALES_TOTAL |
    |------|----------------------------|----------------|-------------|
    |    1 | February, 12 2015 00:00:00 |             22 |          27 |
    |    2 | February, 05 2015 00:00:00 |             18 |          21 |
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-02-23
      • 2018-07-03
      • 2021-08-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多