"Order by" unter Verwendung von "UNION"

MysterioJN

SQL-Guru
Beiträge
158
Hallo zusammen. Ich hab ein Problem bei folgender Fragestellung:

Tabelle mit gruppierten Artikelnummern (BstNr), deren Absatz und deren Umsatz.
Absteigend nach Umsatz sortiert. Zudem soll noch eine Summenzeile am ENDE der Tabelle stehen. Das kann ich mit UNION lösen.

Problem:
- Setzte ich ein "order by tblMessen_Umsatz" in den ersten Select, kommt folgende Fehlermeldung:
"Falsche Syntax in der Nähe des UNION-Schlüsselworts"
- Setzte ich nun das order by ans Ende des UNION, steht die "Summenzeile" ganz oben, da größter Summenwert, was zwar logisch, aber in meinem Fall so nicht gewollt ist.

Hier mal der bisherige Select (einfach ausgedrückt):

SELECT
tblMessen_BstNr AS BstNr,
sum(tblMessen_Absatz)AS Absatz,
sum(tblMessen_Umsatz)AS Umsatz

FROM tblMessen
Groupby tblMessen_BstNr

UNION

SELECT
'Gesamt:',
sum(tblMessen_Absatz),
sum(tblMessen_Umsatz)

FROM tblMessen



Vlt. kann mir hier ja jemand weiterhelfen. Ich will ungern eine "Hilfsspalte" anlegen lassen, wo im ersten Select der Wert = 1 und im Union-Select der Wert = 2 ist, um diesen dann zu sortieren. Bis dato habe ich das, aber die Mitarbeiter fragen zu Recht, was die Spalte bedeutet *räusper*

Beste Grüße
Marco
 
Zuletzt bearbeitet:
Werbung:
Prinzipiell geht das so:

Code:
test=*# with x as (select random() r from generate_series(1,5) s) (select '' "Summe" , * from x order by r) union all select 'Summe:', sum(r) from x;
 Summe  |  r
--------+-------------------
  | 0.165638133417815
  | 0.242920846678317
  | 0.273120970930904
  | 0.555021341890097
  | 0.721846274100244
 Summe: |  1.95854756701738
(6 rows)


Mit 'Hilfsspalte' ;-)
 
Also prinzipiell hat aktretschmer Recht du solltest einfach eine Hilfsspalte nutzen.
Code:
SELECT    *
FROM    (

SELECT
0 AS asdf,
tblMessen_BstNr AS BstNr,
sum(tblMessen_Absatz)AS Absatz,
sum(tblMessen_Umsatz)AS Umsatz

FROM tblMessen
GROUP BY tblMessen_BstNr

UNION

SELECT
1 AS asdf,
'Gesamt:',
sum(tblMessen_Absatz),
sum(tblMessen_Umsatz)

FROM tblMessen

        ) t
ORDER BY t.asdf,t.BstNr
 
Du arbeitest ja normalerweise nicht mit SELECT * sondern definierst, welche Spalten angezeigt werden sollen. Da läßt du die Sortier-Spalte einfach weg, sortieren kannst du aber auch nach Spalten die nicht ausgegeben werden.
 
Hmm Naja aber wir müssen die doch im Select aufführen, da sie sie ja temporär generiert werden muss, um im Anschluss zu sortieren.

SELECT
0 AS asdf,
tblMessen_BstNr AS BstNr,
sum(tblMessen_Absatz)AS Absatz,...

Oder versteh Ich jetzt was falsch?

Edit: ach Moment, jetzt hab ich euren Ansatz erst verstanden. Ihr habt einen Unterselect gebaut und dort definiert. Mhm in meinem hab Ich alles im hauptselect und daher muss(te)ich es aufführen.... Vlt sollte Ich das dann doch noch mal nach eurer Vorgabe umbauen.

Ob Ich die Verschachtelungen jemals verstehen werde :-/

Was bedeutet das "t" am Ende?
 
In meinem Beispiel von Oben wäre das
Code:
SELECT    t.BestNr,
        t.Absatz,
        t.Umsatz
FROM    (

SELECT
0 AS asdf,
tblMessen_BstNr AS BstNr,
sum(tblMessen_Absatz)AS Absatz,
sum(tblMessen_Umsatz)AS Umsatz

FROM tblMessen
GROUP BY tblMessen_BstNr

UNION

SELECT
1 AS asdf,
'Gesamt:',
sum(tblMessen_Absatz),
sum(tblMessen_Umsatz)

FROM tblMessen

        ) t
ORDER BY t.asdf,t.BstNr
 
Werbung:
Guten Morgen! Hab es heute umbauen können. Top!! Es klappt und funktioniert einwandfrei. Herzlichsten Dank !!! Wünsche noch einen angenehmen Wochenstart.
 
Zurück
Oben