Filtern- Wenn vorhanden dann den, sonst einen anderen Datensatz
Hallo,
sorry für die blöde Überschrift, mir fiel jedoch nichts besseres ein ;)
Nehmen wir mal an, ich habe eine einfache Tabelle:
Artikelnummer - Lagerort
1 - 1
2 - 1
3 - 1
3 - 2
4 - 2
Ich benötige nun eine Abfrage, die jede Artikelnummer nur einmal ausgibt und in den zweiten Spalte den Lagerort. Ist der Artikel an Lagerort 1 verfügbar, dann möchte ich, dass dieser Datensatz ausgegeben wird, sonst der des anderen Lagerortes.
Also so:
1 - 1
2 - 1
3 - 1
4 - 2
Geht das in einer gemeinsamen Abfrage oder muss ich zwei mit UNION zusammenführen?
SELECT Artikelnummer, Lagerort FROM ArtLager WHERE Lagerort = 1
UNION
SELECT Artikelnummer, Lagerort FROM ArtLager WHERE Artikelnummer NOT IN (SELECT Artikelnummer, Lagerort FROM ArtLager WHERE Lagerort = 1);
sorry für die blöde Überschrift, mir fiel jedoch nichts besseres ein ;)
Nehmen wir mal an, ich habe eine einfache Tabelle:
Artikelnummer - Lagerort
1 - 1
2 - 1
3 - 1
3 - 2
4 - 2
Ich benötige nun eine Abfrage, die jede Artikelnummer nur einmal ausgibt und in den zweiten Spalte den Lagerort. Ist der Artikel an Lagerort 1 verfügbar, dann möchte ich, dass dieser Datensatz ausgegeben wird, sonst der des anderen Lagerortes.
Also so:
1 - 1
2 - 1
3 - 1
4 - 2
Geht das in einer gemeinsamen Abfrage oder muss ich zwei mit UNION zusammenführen?
SELECT Artikelnummer, Lagerort FROM ArtLager WHERE Lagerort = 1
UNION
SELECT Artikelnummer, Lagerort FROM ArtLager WHERE Artikelnummer NOT IN (SELECT Artikelnummer, Lagerort FROM ArtLager WHERE Lagerort = 1);
Please also mark the comments that contributed to the solution of the article
Content-ID: 197919
Url: https://administrator.de/contentid/197919
Printed on: December 12, 2024 at 20:12 o'clock
9 Comments
Latest comment
Woher ist dann sichergestellt, dass bevorzugt Lagerort 1 kommt?
eigentlich gar nicht - die meisten DB Systeme nutzen dann den "ersten" gefundenen Wert.ABER: es gibt natürlich die Möglichkeiten wie zB die Aggregat Funktionen, welche das regeln können - das kommt dann aber auf dein DB System an.
Das einfachste wäre natürlich ein MIN() zu nutzen.
SELECT Artikelnummer, MIN(Lagerplatz)
...
GROUP BY Artikelnummer
Gibt es in Beispiel 1 nur Berlin und Hamburg? Dann geht MIN(), da Berlin < Hamburg ist.
Beispiel 2 könnte z.B. so klappen.
Gruß Jörg
Beispiel 2 könnte z.B. so klappen.
SELECT a.abteilung AS Abteilung,
IFNULL(SUBSTRING_INDEX(GROUP_CONCAT(a.name ORDER BY a.vertreter SEPARATOR '*'),'*', 1),
'keiner frei') AS Name
FROM (SELECT DISTINCT b.abteilung FROM xy_tabelle b) AS c
LEFT JOIN xy_tabelle AS a USING(abteilung)
WHERE a.frei IS NOT NULL
GROUP BY a.abteilung
Gruß Jörg
Beispiel 2 müsste auch so gehen
Halt ohne Aggregat-Funktion.
Gruß Jörg
SELECT x.abteilung,
IFNULL(IFNULL(y.name,z.name),'keiner frei') Name
FROM (SELECT DISTINCT a.abteilung
FROM xy_tabelle a) AS x
LEFT JOIN (SELECT b.abteilung, b.name
FROM xy_tabelle AS b
WHERE b.vertreter IS NULL AND b.frei IS NOT NULL) AS y USING(abteilung)
LEFT JOIN (SELECT c.abteilung, c.name
FROM xy_tabelle AS c
WHERE b.vertreter IS NOT NULL AND b.frei IS NOT NULL) AS z USING(abteilung)
Halt ohne Aggregat-Funktion.
Gruß Jörg