Sql-Abfrage: Union all

MiZ__

Benutzer
Beiträge
7
Guten Tag miteinander

Ich habe eine Frage betreffend einer Sql-Abfrage und zwar möchte ich einen Auftrag für eine bestimmte Buchungsperiode auswerten, wobei die auszuwertenden Daten sich in zwei verschiedenen Tabellen befinden.

Habe nun nachfolgende Sql-Abfrage erstellt, welche aus 2 Selects besteht die mittels Union All miteinander verknüpft werden. Ich bin ziemlicher Neuling auf dem Sql-Gebiet und von daher gehe ich davon aus, dass meine Abfrage nicht die Ideal-Lösung darstellt..

Ich muss nun jedesmal zweifach die Auftragsnummer sowie das Buchungsdatum eingeben (rot markiert).

SELECT (CSP92020.P92AUFNR) Auftragsnummer,

(CSP92020.P92TMNGI) Menge,

(CSP92020.P92BUDAT) Buchungsdatum

FROM CS2.CSP92020 CSP92020

WHERE (CSP92020.P92AUFNR = '00015000')

AND (CSP92020.P92BUDAT) BETWEEN '2011-01-01' AND '2016-12-31'

UNION ALL

SELECT CSP93020.P93AUFNR,

CSP93020.P93ZEITI,

CSP93020.P93BUDAT

FROM CS2.CSP93020 CSP93020

WHERE (CSP93020.P93AUFNR = '00015000')

AND (CSP93020.P93BUDAT) BETWEEN '2011-01-01' AND '2016-12-31'

Liesse sich die Abfrage nicht auch so erstellen, dass Auftrag bzw. Buchungsdatum nur 1x eingegeben werden müssen, quasi übergeordnet für beide Teil-Selects gelten?

Besten Dank für eure Bemühungen,

Freundlicher Gruss,
MiZ
 
Werbung:
Code:
test=*# select * from (select 'a' as table, s from generate_series(1,10) s(s) union all select 'b', z from generate_series(1,5) z(z)) bla where s = 3 ;
 table | s
-------+---
 a  | 3
 b  | 3
(2 rows)

test=*#
 
Guten Morgen,
Vielen Dank für die prompte Hilfe. Leider stehe ich gleichwohl an..

Habe meine Abfrage nun umgestaltet und mich dabei auf die Auftragsnummer als Where-Condition beschränkt.

SELECT *
FROM
(SELECT (CSP92020.P92AUFNR) Auftragsnummer,
(CSP92020.P92TMNGI) Menge,
(CSP92020.P92BUDAT) Buchungsdatum
FROM CS2.CSP92020 CSP92020

UNION ALL

SELECT CSP93020.P93AUFNR,
CSP93020.P93ZEITI,
CSP93020.P93BUDAT
FROM CS2.CSP93020 CSP93020)

WHERE (CSP92020.P92AUFNR = CSP93020.P93AUFNR)
AND (CSP92020.P92AUFNR = '00015000')

Ergibt beim Auswerten jedoch eine Fehlermeldung.
Könnt ihr mir hier weiterhelfen?

Besten Dank und Gruss,
MiZ__
 
Fehlermeldung lautet:
Lookup Error
ORA-00904: "CSP92020"."P92AUFNR": ungültiger Bezeichner

Da die Auftragsnummer in den beiden Teil-Selects in unterschiedlichen Feldern hinterlegt ist (CSP93020.P93AUFNR bzw. CSP92020.P92AUFNR) und ich die Auftragsnummer in der WHERE Bedingung nur 1x eingeben möchte, wollte ich dies wie oben gezeigt bewerkstelligen.
Scheint aber offensichtlich nicht die korrekte Lösung zu sein..

Ich möchte die Auftragsnummer einmalig eingeben, so dass diese in die beiden Teil-Abfragen (in die Felder CSP93020.P93AUFNR bzw. CSP92020.P92AUFNR) übernommen wird.

Aber vielleicht ist die Abfrage ja grundsätzlich falsch aufgebaut. Ich habe 2 Tabellen, CS2.CSP92020 mit den Lohnkosten, Mengen, Buchungsdatum pro Auftrag, CS2.CSP93020 mit den Materialkosten, Mengen, Buchungsdatum pro Auftrag.
Nun möchte ich für einen bestimmen Auftrag alle Lohnkosten bzw. Materialkosten, deren Mengen und das jeweilige Buchungsdatum auswerten. Wobei in Spalte A die Lohn- bzw. Materialkosten, in Spalte B die Mengen und in Spalte C das Buchungsdatum stehen soll.
 
Die Spaltennamen nach so einer Union-Orgie richten sich nach den Namen der Salten in der ersten aufgeführten Tabelle.

Lese ich da raus, dass meine Vorgehensweise mit der Union-Funktion nicht ganz der Ideallösung entspricht?

Wie müsste ich so eine Abfrage dann gestalten, könnt ihr mir einen Hinweis hierzu geben?
An und für sich habe ich ja eine korrekte Abfrage (siehe obersten Beitrag), diese ist nur umständlich, da ich die Auftragsnummer zweifach eingeben muss.
 
Lese ich da raus, dass meine Vorgehensweise mit der Union-Funktion nicht ganz der Ideallösung entspricht?

Nein. Um es mal zu zeigen:

Code:
test=# create table x(a int, b int);
CREATE TABLE
test=*# create table y(c int, d int);
CREATE TABLE
test=*# select a as m, b as n from x union all select c, d from y;
 m | n
---+---
(0 Zeilen)

Man beachte die Spaltennamen.
 
Nein. Um es mal zu zeigen:

Code:
test=# create table x(a int, b int);
CREATE TABLE
test=*# create table y(c int, d int);
CREATE TABLE
test=*# select a as m, b as n from x union all select c, d from y;
m | n
---+---
(0 Zeilen)

Man beachte die Spaltennamen.

Da ich die beiden Positionen "Lohnkosten" und "Materialkosten" in derselben Spalte ausweisen möchte, passt das Verwenden der Union-Funktion aber schon, oder? Die Spaltennamen stören mich nicht weiter, wenn ich Spalte A "Kosten" nenne, dann passt sie für Lohn- wie auch für Materialkosten.

Mein ursprüngliches Problem mit der WHERE-Bedingung ist aber weiterhin ungeklärt, oder habe ich da was übersehen
? Ich bin froh, wenn ihr mir diesbezüglich nochmals ein wenig Hilfestellung geben könnt, da ich wie gesagt (und vermutlich unschwer erkennbar) ein ziemlicher Neuling auf dem sql-Gebiet bin.
 
Ich steh an, auch mit deinen Hinweisen aus #3. Das Ganze ist mir irgendwie zu abstrakt.

Du könntest nicht deine Hinweise ein bisschen konkreter auf meine Abfrage beziehen, dh. mit meinen Feld- bzw.Tabellennamen befüllen?

Vielen Dank und schönen Abend,
 
Wenn ich das richtig sehe ist dein einziges Problem das die Spaltenanzahl oder das Spaltenformat deiner beiden Selects beim UNION ALL nicht übereinstimmen. Also SELECT * durch explizite Spaltennamen ersetzen, die Anzahl und das Format muss gleich sein.
 
SELECT *
FROM
(SELECT (CSP92020.P92AUFNR) Auftragsnummer,
(CSP92020.P92TMNGI) Menge,
(CSP92020.P92BUDAT) Buchungsdatum
FROM CS2.CSP92020 CSP92020

UNION ALL

SELECT CSP93020.P93AUFNR,
CSP93020.P93ZEITI,
CSP93020.P93BUDAT
FROM CS2.CSP93020 CSP93020)

WHERE (CSP92020.P92AUFNR = CSP93020.P93AUFNR)
AND (CSP92020.P92AUFNR = '00015000')


Sollte etwa so sein:

select * from (
SELECT (CSP92020.P92AUFNR) Auftragsnummer,
(CSP92020.P92TMNGI) Menge,
(CSP92020.P92BUDAT) Buchungsdatum
FROM CS2.CSP92020 CSP92020
UNION ALL
SELECT CSP93020.P93AUFNR,
CSP93020.P93ZEITI,
CSP93020.P93BUDAT
FROM CS2.CSP93020 CSP93020
)
where Auftragsnummer = '00015000';


Der erste Part in Deinem Where ist Unfug, im zweiten Teil greifst Du auf eine Spalte zu, die es nicht gibt, da Du dieser im Inneren einen anderen Namen gegeben hast.
 
Werbung:
Sollte etwa so sein:

select * from (
SELECT (CSP92020.P92AUFNR) Auftragsnummer,
(CSP92020.P92TMNGI) Menge,
(CSP92020.P92BUDAT) Buchungsdatum
FROM CS2.CSP92020 CSP92020
UNION ALL
SELECT CSP93020.P93AUFNR,
CSP93020.P93ZEITI,
CSP93020.P93BUDAT
FROM CS2.CSP93020 CSP93020
)
where Auftragsnummer = '00015000';


Der erste Part in Deinem Where ist Unfug, im zweiten Teil greifst Du auf eine Spalte zu, die es nicht gibt, da Du dieser im Inneren einen anderen Namen gegeben hast.

So klappts wunderbar:)
Recht herzlichen Dank für die Geduld und Hilfsbereitschaft.

Allen einen schönen Tag und Gruss,
MiZ__
 
Zurück
Oben