Common question, I know. Just haven’t been able to find a solution to my question, so hit me with the removal and or downvotes if you must.
(Oracle 12c)
I have data that looks like this:
x
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
.
I want to get QTY to aggregate (sum) at the Date and item level with only one record for each unique item on each date, so it looks like this:
Date ITEM QTY
01-MAR-20 STS 9501
01-MAR-20 S01 100918
The query I’m trying to use to do this is:
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;
Advertisement
Answer
A date
data type in Oracle can have a time component. So you need to be careful. Unless you know hat you have no time component, trunc()
is safer. Also, you can use the date
keyword to handle date constants:
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);
Notes:
- You don’t need an analytic function. Aggregation should be sufficient.
- Use proper, explicit, standard, readable
JOIN
syntax. - I assume the column in the
ORDER BY
is intended to be the first column in the result set.