Case met max

Status
Niet open voor verdere reacties.
Zo houdt hij toch nog steeds geen rekening met met de itemid's?

Ik krijg precies dezelfde resultaten als met:
CASE WHEN MAX(dbo.INVENTSUM.AVAILPHYSICAL) > 0 THEN CONVERT(int, dbo.DYN_MINMAXPROPOSALS.NEW_MINONHAND) else 0 END
 
De resultaten die je krijgt zijn afhankelijk van de group by. als je "itemid" weglaat uit group by? Ik kan vandaag jammer genoeg niet testen.
 
De precieze reden ervan weet ik niet, maar het is niet de 1ste keer dat het voortkomt.

Ik kan niets uit de group by weglaten, ook niet itemid.....

Maakt niets uit, ik ben al lang blij dat iemand me wil helpen.
 
Ik heb gister nog even getest, maar mijn front-end kan wel goed omgaan met beperkingen in group by en de case statement. Welke database gebruik je momenteel? mogelijk is er een propriatary oplossing voor de database die je gebruikt.
 
Ik maak gebruik van Microsoft SQL Server Management Studio. Ik gebruik een sync database (axapta).

Welke gegevens zou je nog willen hebben en waar kan ik deze vinden?
 
Zelfs als ik de itemid uit de select haal en deze vervolgens uit de group by haal krijgt een setje van 2 dezelfde itemid's dezelfde waarde (minmax)
 
Als het met group by niet kan (sorry geen tijd momenteel om naar MSSQL specifieke trucks te zoeken), zou je een subselect kunnen maken met

WHERE availphysical = exp2

Ik weet vrij zeker dat MSSQL zo een subselect constructie zou moeten ondersteunen.
 
Ik heb nu een subquery gemaakt waarmee in de kolom TopLocation de locatie met de hoogste voorraad wordt weergegeven. Nu zou ik dus een case kunnen maken in de vorm van [SQL]case when wmslocationid = toplocation then news_minonhand else 0[/SQL] maar hoe gaat dit, je kunt niet zomaar een case maken op een kolom die in de select staat met een subquery.

on5Gq.png


[sql]SELECT DISTINCT
TOP (100) PERCENT dbo.INVENTTABLE.ITEMID, dbo.INVENTTABLE.ITEMNAME, CONVERT(int, dbo.DYN_MINMAXPROPOSALS.NEW_MINONHAND)
AS NEW_MINONHAND, CONVERT(int, dbo.DYN_MINMAXPROPOSALS.NEW_MAXONHAND) AS NEW_MAXONHAND, CONVERT(int, dbo.INVENTSUM.AVAILPHYSICAL)
AS AVAILPHYSICAL, dbo.INVENTDIM.WMSLOCATIONID,
(SELECT TOP (1) INVENTDIM_1.WMSLOCATIONID
FROM dbo.INVENTTABLE AS INVENTTABLE_1 INNER JOIN
dbo.INVENTITEMLOCATION AS INVENTITEMLOCATION_1 ON INVENTTABLE_1.ITEMID = INVENTITEMLOCATION_1.ITEMID AND
INVENTTABLE_1.DATAAREAID = INVENTITEMLOCATION_1.DATAAREAID INNER JOIN
dbo.INVENTSUM AS INVENTSUM_1 ON INVENTITEMLOCATION_1.DATAAREAID = INVENTSUM_1.DATAAREAID AND
INVENTITEMLOCATION_1.ITEMID = INVENTSUM_1.ITEMID INNER JOIN
dbo.INVENTDIM AS INVENTDIM_1 ON INVENTSUM_1.DATAAREAID = INVENTDIM_1.DATAAREAID AND
INVENTSUM_1.INVENTDIMID = INVENTDIM_1.INVENTDIMID
WHERE (INVENTITEMLOCATION_1.WMSPICKINGLOCATION LIKE 'HTC.%') AND (NOT (INVENTDIM_1.WMSLOCATIONID LIKE 'rw')) AND
(NOT (INVENTDIM_1.WMSLOCATIONID LIKE 'repair')) AND (NOT (INVENTDIM_1.INVENTLOCATIONID LIKE 'voda-%')) AND
(NOT (INVENTDIM_1.WMSLOCATIONID LIKE 'spwh')) AND (NOT (INVENTDIM_1.WMSLOCATIONID LIKE 'htc')) AND (INVENTDIM_1.WMSLOCATIONID <> '')
AND (NOT (INVENTDIM_1.INVENTLOCATIONID LIKE 'mw')) AND (INVENTTABLE_1.DATAAREAID = dbo.INVENTTABLE.DATAAREAID) AND
(INVENTTABLE_1.ITEMID = dbo.INVENTTABLE.ITEMID)
ORDER BY CONVERT(int, INVENTSUM_1.AVAILPHYSICAL) DESC) AS TopLocation
FROM dbo.INVENTTABLE INNER JOIN
dbo.INVENTITEMLOCATION ON dbo.INVENTTABLE.ITEMID = dbo.INVENTITEMLOCATION.ITEMID AND
dbo.INVENTTABLE.DATAAREAID = dbo.INVENTITEMLOCATION.DATAAREAID INNER JOIN
dbo.DYN_MINMAXPROPOSALS ON dbo.INVENTTABLE.DATAAREAID = dbo.DYN_MINMAXPROPOSALS.DATAAREAID AND
dbo.INVENTTABLE.ITEMID = dbo.DYN_MINMAXPROPOSALS.ITEMID INNER JOIN
dbo.INVENTSUM ON dbo.INVENTITEMLOCATION.DATAAREAID = dbo.INVENTSUM.DATAAREAID AND
dbo.INVENTITEMLOCATION.ITEMID = dbo.INVENTSUM.ITEMID INNER JOIN
dbo.INVENTDIM ON dbo.INVENTDIM.DATAAREAID = dbo.INVENTSUM.DATAAREAID AND dbo.INVENTDIM.INVENTDIMID = dbo.INVENTSUM.INVENTDIMID
WHERE (dbo.INVENTITEMLOCATION.WMSPICKINGLOCATION LIKE 'HTC.%') AND (NOT (dbo.INVENTDIM.WMSLOCATIONID LIKE 'rw')) AND
(NOT (dbo.INVENTDIM.WMSLOCATIONID LIKE 'repair')) AND (NOT (dbo.INVENTDIM.INVENTLOCATIONID LIKE 'voda-%')) AND
(NOT (dbo.INVENTDIM.WMSLOCATIONID LIKE 'spwh')) AND (NOT (dbo.INVENTDIM.WMSLOCATIONID LIKE 'htc')) AND (dbo.INVENTDIM.WMSLOCATIONID <> '') AND
(NOT (dbo.INVENTDIM.INVENTLOCATIONID LIKE 'mw'))
ORDER BY dbo.INVENTTABLE.ITEMID[/sql]
 
Ik snap alleen niet waarom je een groot deel van je query herhaalt, zoals de where. Een subselect heeft als uitgangspunt de vorige tabel. Alles wat gefilterd is in de originele query kan niet voorkomen in je tweede select.

Je hoeft je select dus alleen aan te passen aan de hand van de tabel die je had bij je originele query. Hierop hoor je gewoon met de dan bekende kolomnamen een CASE / WHERE etc. uit te kunnen voeren (oracle, mysql)
 
Ik heb inderdaad een groot gedeelte van de where in de subquery weg kunnen halen.

Ik weet echter helaas niet hoe ik nu verder moet. Kan ik de subquery die uiteindelijk de kolom naam TopLocation krijgt en n de select staat ook gebruiken in een case die ik in de select maak? Of deze TopLocation gebruiken in een where?
 
Niemand? Het lijkt dat ik bijna heb wat ik wil, alleen de laatste stap maken lukt niet....
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan