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:
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
JOINsyntax. - I assume the column in the
ORDER BYis intended to be the first column in the result set.