Mehrere SELECT in einer Abfrage

Enrico Holz

Benutzer
Beiträge
8
Hallo,

ich möchte mehere SELECT in einer Abfrage zusammen bekommen, die dann in einer Tabelle nebeneinander ausgegeben werden.
Momentan führe ich alle drei nacheinander aus was ein bisschen umständlich ist.

Meine SQL Erfahrungen sind rein Learning by doing, und hier stoße ich gerade an meine Grenzen.
Das sind die drei Abfragen:

SELECT
COUNT (DISTINCT bestandsbewegung.sachnummer) AS Artikel_WA ,
SUM(bestandsbewegung.istmenge) AS Stückzahl_WA

FROM
bestandsbewegung

WHERE
lagerort = '0010'
AND bewegungsart = 'VSD'
AND TRUNC (newdat) = '22.04.2024'

____________________________________________________________________________

SELECT
COUNT(DISTINCT bestandsbewegung.le_nummer) AS Paletten

FROM
bestandsbewegung

WHERE
Lagerbereich in('PLK','PLN','PLA','PL3','PLS')
AND Bewegungsart in('101','501')
AND TRUNC (newdat) = '22.04.2024'

___________________________________________________________________________

SELECT
COUNT (DISTINCT bestandsbewegung.sachnummer) AS Artikel_WE ,
SUM(bestandsbewegung.istmenge) AS Stückzahl_WE

FROM
bestandsbewegung

WHERE
lagerort = '0010'
AND bewegungsart in ('101','501','561')
AND TRUNC (newdat) = '22.04.2024'

Vielen Dank schon mal im Voraus.


VG Enrico
 
Werbung:
Aggregate ignorieren NULL Werte. Wenn man einen Ausdruck verwendet der nicht NULL ist für die Zeilen die man zählen/summieren will, kann man auch nur eine Teilmenge aggregieren. Bei Oracle geht das leider nur mit einem CASE Ausdruck:

Code:
SELECT COUNT(DISTINCT CASE WHEN lagerort = '0010' AND bewegungsart = 'VSD' then bestandsbewegung.sachnummer END) AS Artikel_WA,
       SUM(CASE WHEN lagerort = '0010' AND bewegungsart = 'VSD' AND TRUNC(newdat) = DATE '2024-04-22' THEN istmenge END) AS Stückzahl_WA,
       COUNT(DISTINCT CASE WHEN Lagerbereich in('PLK','PLN','PLA','PL3','PLS') AND Bewegungsart in('101','501') THEN le_nummer END) AS Paletten,
       COUNT(DISTINCT CASE WHEN lagerort = '0010' AND bewegungsart in ('101','501','561') THEN sachnummer END) AS Artikel_WE ,
       SUM(CASE WHEN lagerort = '0010' AND bewegungsart in ('101','501','561') THEN istmenge END) AS Stückzahl_WE
FROM bestandsbewegung
WHERE TRUNC(newdat) = DATE '2024-04-22'

Da alle Deine drei Abfragen die gleiche Bedingung für newdat hatten, kann man die in der WHERE Bedingung lassen. Ich rate sehr stark davon ab Datumswerte zu spezifizieren, die abhängig von der Umgebung sind (auf einem meiner Rechner würde die Bedingung TRUNC (newdat) = '22.04.2024' einen Fehler produzieren auf einem anderen würde sie funktionieren). Ein ANSI formatierter Datumswert funktioniert immer, egal wie der Rechner der den SQL Befehl schickt, konfiguriert ist.
 
Hallo,

besten Dank, das war ja schneller als die Polizei erlaubt. Ich werde mir das gleich mal ansehen.
newdat mit GROUP BY, klingt interessant in der Tabelle werden die Daten der letzten 40 Tage geschrieben,
was älter ist wird in eine ander Tabelle archiviert.
 
Hallo,

da ihr mir vor einer weile schon mal gut geholfen habt, versuche ich es doch gleich nochmal.
Ich habe jetzt mal mit dem CASE ein bischen rumexperimentiert und habe das Problem das bei der Ausgabe für die leeren Felder eine NULL geschrieben wird. Kann man das so darstellen das die NULL nicht angezeigt wird.

SELECT
(Case When Stationsadresse = 'AKG01' Then le_nummer End) AS AKG1,
(Case When Stationsadresse = 'AKG02' Then le_nummer End) AS AKG2,
(Case When Stationsadresse = 'AKG03' Then le_nummer End) AS AKG3,
(Case When Stationsadresse = 'AKG04' Then le_nummer End) AS AKG4,
(Case When Stationsadresse = 'AKG05' Then le_nummer End) AS AKG5,
(Case When Stationsadresse = 'AKG06' Then le_nummer End) AS AKG6,
(Case When Stationsadresse = 'AKG07' Then le_nummer End) AS AKG7,
(Case When Stationsadresse = 'AKG08' Then le_nummer End) AS AKG8,
(Case When Stationsadresse = 'KEG01' Then le_nummer End) AS KAB3,
(Case When Stationsadresse = 'KEG02' Then le_nummer End) AS KAB2,
(Case When Stationsadresse = 'KEG03' Then le_nummer End) AS KAB1,
(Case When Stationsadresse = 'KEG04' Then le_nummer End) AS KAB4,
(Case When Stationsadresse = 'KOG02' Then le_nummer End) AS KAB5,
(Case When Stationsadresse = 'KOG03' Then le_nummer End) AS KAB6,
(Case When Stationsadresse = 'KOG04' Then le_nummer End) AS KAB7,
(Case When Stationsadresse = 'KOG05' Then le_nummer End) AS KAB8,
(Case When Stationsadresse = 'KOG06' Then le_nummer End) AS KCD9,
(Case When Stationsadresse = 'KOG07' Then le_nummer End) AS KCD10,
(Case When Stationsadresse = 'KOG08' Then le_nummer End) AS KCD11,
(Case When Stationsadresse = 'KOG09' Then le_nummer End) AS KCD12,
(Case When Stationsadresse = 'KZG01' Then le_nummer End) AS KCD13,
(Case When Stationsadresse = 'KZG02' Then le_nummer End) AS KCD14,
(Case When Stationsadresse = 'KZG03' Then le_nummer End) AS KCD15
FROM
transportanmeldung

Die Auswertung seht ihr auf dem Screenshot.
2024-09-12 12_55_33-Oracle SQL Developer .webp
 
Das kannst Du über eine Aggregation lösen

Code:
SELECT
  max(Case When Stationsadresse = 'AKG01' Then le_nummer End) AS AKG1,
  max(Case When Stationsadresse = 'AKG02' Then le_nummer End) AS AKG2,
  max(Case When Stationsadresse = 'AKG03' Then le_nummer End) AS AKG3,
  max(Case When Stationsadresse = 'AKG04' Then le_nummer End) AS AKG4,
  max(Case When Stationsadresse = 'AKG05' Then le_nummer End) AS AKG5,
  max(Case When Stationsadresse = 'AKG06' Then le_nummer End) AS AKG6,
  max(Case When Stationsadresse = 'AKG07' Then le_nummer End) AS AKG7,
  max(Case When Stationsadresse = 'AKG08' Then le_nummer End) AS AKG8,
  max(Case When Stationsadresse = 'KEG01' Then le_nummer End) AS KAB3,
  max(Case When Stationsadresse = 'KEG02' Then le_nummer End) AS KAB2,
  max(Case When Stationsadresse = 'KEG03' Then le_nummer End) AS KAB1,
  max(Case When Stationsadresse = 'KEG04' Then le_nummer End) AS KAB4,
  max(Case When Stationsadresse = 'KOG02' Then le_nummer End) AS KAB5,
  max(Case When Stationsadresse = 'KOG03' Then le_nummer End) AS KAB6,
  max(Case When Stationsadresse = 'KOG04' Then le_nummer End) AS KAB7,
  max(Case When Stationsadresse = 'KOG05' Then le_nummer End) AS KAB8,
  max(Case When Stationsadresse = 'KOG06' Then le_nummer End) AS KCD9,
  max(Case When Stationsadresse = 'KOG07' Then le_nummer End) AS KCD10,
  max(Case When Stationsadresse = 'KOG08' Then le_nummer End) AS KCD11,
  max(Case When Stationsadresse = 'KOG09' Then le_nummer End) AS KCD12,
  max(Case When Stationsadresse = 'KZG01' Then le_nummer End) AS KCD13,
  max(Case When Stationsadresse = 'KZG02' Then le_nummer End) AS KCD14,
  max(Case When Stationsadresse = 'KZG03' Then le_nummer End) AS KCD15
FROM
  transportanmeldung
 
Hallo,

das habe ich leider schon probiert, dann wird nur ein Wert ausgegeben.
Aber es sind ja verschiedene z.B. Stationsadresse = 'KOG02' hat 5 Werte oder Stationsadresse = 'KOG07' hat 10 Werte.
Die möchte ich alle sehen.

VG
Enrico
 
in PG gibt es coalesce:

Code:
postgres=# select NULL;
 ?column? 
----------
 NULL;
(1 row)

postgres=# select coalesce(NULL,'');
 coalesce 
----------
 
(1 row)

postgres=#

hilft das?
 
Naja, wenn Du 15 Spalten hast, in denen nicht immer was drin steht, aber über mehrere Zeile Werte in einer Spalte stehen können, dann geht es nur mit den NULL Werten. Wenn Du Dich aber nur an der Anzeige von (null) störst, dann musst Du das in dem Tool abschalten welches die Daten anzeigt.
 
Alternativ kannst Du natürlich auch alle Werte als Komma separierte Liste ausgeben:

Code:
SELECT listagg(Case When Stationsadresse = 'AKG01' Then le_nummer End, ',') AS AKG1,
       listagg(Case When Stationsadresse = 'AKG02' Then le_nummer End, ',') AS AKG2,
       ...
FROM transportanmeldung
 
Also zunächst mal ist das Anzeigeformat immer Sache des Clients, wurde ja schon gesagt. (null) als leer anzuzeigen, ist halt eine Art der Darstellung.

Wenn das aus irgendwelchen Gründen nicht geht kannst du aber natürlich auch dein CASE anpassen und eine Zeichenkette mit einer Länge von 0 ausgeben.
Code:
SELECT
(Case When Stationsadresse = 'AKG01' Then le_nummer Else '' End) AS AKG1,
 
Hallo,

das Problem ist nicht unbedinkt die Null, habe ich mich vieleicht falsch ausgedrück. Das Problem ist der Versatzt in den Zeilen, wenn in 'AKG01' 2 Werte gefunden werden und in 'AKG02' auch 2 Werte dann verscheiben sich die Weiteren Zeilen um je 2 Stück.
Ich habe mal zur Anschauung noch mal ein Screenshot angehängt. Dargestellt in Excel dort ist es besser zu erkennen.

2024-09-12 14_58_12-Mappe1 - Excel.webp
 
Werbung:
Zurück
Oben