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 日期而不是 VARCHAR
s。
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
中的列是结果集中的第一列。
常见问题,我知道。只是无法找到我的问题的解决方案,所以如果必须的话,请通过删除和/或否决票来打击我。
(甲骨文 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 日期而不是 VARCHAR
s。
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
中的列是结果集中的第一列。