I am trying to retrieve only the most recent date for each item using Oracle however I am unable to get this working. I have tried using Min
e.g MIN(ActDemand.DUEDATE_ED) AS Date_Required,
but get a GROUP BY error ORA-00979: not a group by experession.
Code Example
WITH CoreDateData AS
(SELECT BusinessName,
A.Business,
A.TYPE,
A.Item_Code,
A.wordnoent,
A.Item_Description,
A.Date_Required,
A.TotalQtyRequired,
A.SumTotalQtyRequired,
NVL(SUM (Quantity_Required) OVER (PARTITION BY Business, TYPE, ITEM_CODE order BY Business, ITEM_CODE, Date_Required asc ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW),0) AS CumulativeTotalQtyRequired,
ROW_NUMBER () OVER (PARTITION BY Business, TYPE, Item_Code ORDER BY Date_Required asc) AS ROWNUMBER,
SYSDATE + 14 AS DateTo
FROM (SELECT DISTINCT DISCO_BUSINESS (Items.ACCOUNT15) BUSINESSNAME,
Items.Account15 AS Business,
Items.Partype AS TYPE,
Items.Partno AS Item_Code,
ActDemand.wordnoent as wordnoent,
Items.Description AS Item_Description,
TO_DATE(ActDemand.DUEDATE_ED, 'DD-MM-YY') AS Date_Required,
ActDemand.DUEQTY AS Quantity_Required,
NVL(SUM (ActDemand.DUEQTY) OVER (PARTITION BY Items.Account15, Items.Partype, Items.Partno),0) AS SumTotalQtyRequired,
ActDemand.DUEQTY as TotalQtyRequired
FROM Items
LEFT OUTER JOIN ACTUAL_DEMAND ActDemand
ON ActDemand.Business = Items.Account15
AND ActDemand.Partno_com = Items.Partno
WHERE TRIM(actdemand.WORDNOENT) IS NOT NULL
ORDER BY Items.Account15, Items.Partype, Items.Partno,Date_Required) A)
SELECT BusinessName,
Business,
TYPE,
Item_Code,
wordnoent,
Item_Description,
Unapproved_Lot,
Lot_Quantity,
Date_Required,
TotalQtyRequired,
SumTotalQtyRequired,
CumulativeTotalQtyRequired,
Current_Approved_Stock,
Approved_Stock_quantity,
Total_Approved_Stock_quantity,
DateTo
FROM (
SELECT BusinessName,
Business,
TYPE,
Item_Code,
wordnoent,
Item_Description,
Unapproved_Lot,
Lot_Quantity,
Date_Required,
TotalQtyRequired,
SumTotalQtyRequired,
CumulativeTotalQtyRequired,
Current_Approved_Stock,
Approved_Stock_quantity,
SUM(Approved_Stock_quantity)
OVER(PARTITION BY Business,
TYPE, Item_Code, wordnoent, unapproved_lot)
AS Total_Approved_Stock_quantity,
DateTo
(SELECT DISTINCT B.BusinessName,
B.Business,
B.TYPE,
B.Item_Code,
B.wordnoent,
B.Item_Description,
B.Unapproved_Lot,
B.Lot_Quantity,
B.Date_Required,
B.TotalQtyRequired,
B.SumTotalQtyRequired,
B.CumulativeTotalQtyRequired,
CASE WHEN APLot.lotapproind = 'Y'
THEN APLot.lotnopre || APLot.lotno
ELSE 'N/A'
END AS Current_Approved_Stock,
CASE WHEN APLot.lotapproind = 'Y'
THEN NVL (APLot.lotqty, 0)
ELSE 0
END AS Approved_Stock_quantity,
DateTo
FROM (SELECT BusinessName,
Business,
TYPE,
Item_Code,
wordnoent,
Item_Description,
Unapproved_Lot,
NVL (Lot_quantity, 0) AS Lot_Quantity,
Date_Required,
TotalQtyRequired,
SumTotalQtyRequired,
CumulativeTotalQtyRequired,
ROW_NUMBER () OVER (PARTITION BY Business, TYPE, Item_Code ORDER BY Date_Required asc) AS NEWROWNUMBER,
TO_DATE (DateTo, 'DD/MM/RRRR') AS DateTo
FROM (SELECT DISTINCT CDD.BusinessName, CDD.Business, CDD.TYPE, CDD.Item_Code, CDD.wordnoent, CDD.Item_Description,
CASE WHEN UPPER (Unapprove.LotApproind) != 'Y'
THEN Unapprove.LotNoPre || Unapprove.LotNo
ELSE 'N/A'
END AS Unapproved_Lot,
CASE WHEN Unapprove.lotapproind != 'Y'
THEN Unapprove.Lotqty
END AS Lot_quantity,
CDD.Date_Required,
CDD.TotalQtyRequired as TotalQtyRequired,
CDD.SumTotalQtyRequired AS SumTotalQtyRequired,
CDD.CumulativeTotalQtyRequired AS CumulativeTotalQtyRequired,
CDD.DateTo
FROM CoreDateData CDD
INNER JOIN (SELECT UNLOT.PARTNO_LOT, UNLOT.ACCOUNT15_LOT, UnLot.Lotqty, UnLot.lotapproind,
UnLot.LotNoPre, UnLot.LotNo
FROM UnLot
INNER JOIN Inv
ON UNLOT.PARTNO_LOT = Inv.partno_inv
AND UNLOT.ACCOUNT15_LOT = Inv.Account15_Inv
AND approind = 'M'
INNER JOIN Alt
ON UNLOT.PARTNO_LOT = Alt.partno_alt
AND UNLOT.ACCOUNT15_LOT = Alt.Account15_alt
AND UNLOT.LOTNO = ALT.LOTNO_ALT
AND locqrstock = 0
WHERE (UnlOT.lotqty != 0)
AND UPPER (UnLot.LotApproind) != 'Y') Unapprove
ON CDD.Item_Code = Unapprove.partno_lot
AND CDD.Business = Unapprove.Account15_Lot
)) B
LEFT OUTER JOIN ApLot
ON B.Item_Code = ApLot.partno_lot
AND B.Business = ApLot.Account15_Lot
AND UPPER (APLot.LotApproind) = 'Y'
AND ApLot.lotqty != 0)) A
WHERE (CumulativeTotalQtyRequired > A.Total_Approved_Stock_quantity)
ORDER BY DATE_REQUIRED ASC
Below is an example of a partial data extract
Data Example
| Business | Type | Item | Description | Unapproved Lots | Lot Quantity | Date Required |
|---|---|---|---|---|---|---|
| Alpha | IN | I100 | A Description | L102 | 90414 | 15 Oct 21 |
| Alpha | IN | I100 | A Description | L102 | 90414 | 15 Oct 21 |
| Alpha | IN | I100 | A Description | L102 | 90414 | 15 Oct 21 |
| Alpha | IN | I100 | A Description | L102 | 90414 | 18 Oct 21 |
| Alpha | IN | I100 | A Description | L102 | 90414 | 18 Oct 21 |
| Alpha | IN | I100 | A Description | L102 | 90414 | 18 Oct 21 |
So for the example above I would only like to return the top three rows where the Date Required = 15 Oct 2021
I would be grateful for any help of assistance.