SQL SUM OVER PARTITION BY 2 列无效

SQL SUM OVER PARTITION BY 2 columns not working

常见问题,我知道。只是无法找到我的问题的解决方案,所以如果必须的话,请通过删除和/或否决票来打击我。

(甲骨文 12c)

我有这样的数据:

Date        ITEM   QTY

01-MAR-20   STS    6920
01-MAR-20   STS    2581
01-MAR-20   S01    22606
01-MAR-20   S01    22312
01-MAR-20   S01    56000
....

我想让 QTY 在日期和项目级别聚合(求和),每个日期的每个唯一项目只有一条记录,所以它看起来像这样:

Date        ITEM   QTY
01-MAR-20   STS    9501
01-MAR-20   S01    100918

我尝试使用的查询是:

SELECT 

WO.DATE,
D.ITEM,
SUM(WO.QUANTITY) OVER (PARTITION BY WO.DATE, D.ITEM) AS QTY

FROM SCHEMA_1.WO,
SCHEMA_2.D

WHERE WO.ITEM_DIM_KEY = D.ITEM_DIM_KEY AND
(DATE > '01 MAR 2020' AND DATE < '01 JUL 2020')
ORDER BY WO.COMPLETED_DATE;

您只需要一个基本的 GROUP BY 查询:

SELECT
    WO.DATE,
    D.ITEM,
    SUM(WO.QUANTITY) AS QTY
FROM SCHEMA_1.WO
INNER JOIN SCHEMA_2.D
    ON WO.ITEM_DIM_KEY = D.ITEM_DIM_KEY
WHERE
    DATE > '01 MAR 2020' AND DATE < '01 JUL 2020'
GROUP BY
    WO.DATE,
    D.ITEM
ORDER BY
    WO.COMPLETED_DATE;

如果您想保留连接结果集中的每条记录,将SUM用作window函数是有意义的。但是,在您的情况下,您想要报告每个 date/item 组的 聚合 总和。使用 GROUP BY 就是你想要的。

我认为你只需要一个简单的聚合:

select trunc(date), item, sum(qty) 
from schema_1.wo
join schema_2.d on wo.item_dim_key = d.item_dim_key 
where date > date '2020-03-01' and date < date '2020-07-01'
group by trunc(date), item
order by wo.completed_date

顺便说一句,我将 JOIN 升级到 SQL-92,并将日期文字固定为 ISO 日期而不是 VARCHARs。

Oracle 中的 date 数据类型可以包含时间部分。所以你需要小心。除非您 知道 没有时间成分,否则 trunc() 更安全。此外,您可以使用 date 关键字来处理日期常量: SELECT

SELECT TRUNC(WO.DATE), D.ITEM,
       SUM(WO.QUANTITY)
FROM SCHEMA_1.WO JOIN
     SCHEMA_2.D
     ON WO.ITEM_DIM_KEY = D.ITEM_DIM_KEY 
WHERE WO.DATE >= DATE '2020-03-01' AND
      WO.DATE < DATE '2020-07-01'
GROUP BY TRUNC(WO.DATE), D.ITEM
ORDER BY TRUNC(WO.DATE);

备注:

  • 您不需要分析函数。聚合应该足够了。
  • 使用正确、明确、标准、可读的JOIN语法。
  • 我假设 ORDER BY 中的列是结果集中的第一列。