sql按2列分区求和不起作用

p1tboqfb  于 2021-07-26  发布在  Java
关注(0)|答案(3)|浏览(270)

常见的问题,我知道。只是还没能找到解决我问题的办法,所以打我的免职和/或反对票,如果你必须的话。
(甲骨文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
....

我希望在日期和项目级别获取要聚合的数量(总和),每个日期的每个唯一项目只有一条记录,因此如下所示:

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;
dwbf0jvd

dwbf0jvd1#

date oracle中的数据类型可以有时间组件。所以你要小心。除非你知道你没有时间成分, 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 是结果集中的第一列。

mqkwyuun

mqkwyuun2#

你只需要一个基本的 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 如果希望保留联接结果集中的每条记录,那么作为窗口函数是有意义的。但是,在您的情况下,您需要报告每个日期/项目组的合计金额。使用 GROUP BY 这就是你想要的。

n7taea2i

n7taea2i3#

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

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 并将日期文字改为iso日期,而不是 VARCHAR s。

相关问题