PDA

View Full Version : SQL mit Teilergebnis



ExAzubi
20-01-15, 12:16
Hallo zusammen,

ich habe ein SQL mit folgenden Spalten

<tbody>
Firma
Lieferschein
Datum

Kunden-Nr

Name

Straße

Ort

Artikel

Bezeichnung

P-Fakt

Anz.Pal


</tbody>


Nun möchte ich diese Ausgabe nach Datum und Lieferschein sortieren und die Spalte "Anz. Pal" darauf summieren. D.h. Anz. Pal pro Lieferschein und Tag.

Ich habe mir die Funktion "ROLLUP" mal angeschaut, aber diese bildet mir ja nach jeder Spalte eine Summe :(

Bei einem QUERY kann man ja ganz unabhängig sich die Summen bilden lassen; welche Möglichkeiten habe mit mit "nacktem" SQL?

Danke an alle Helfenden.

Fuerchau
20-01-15, 12:20
Ganz klassisch geht dies mit Aggregatfunktionen und Group by, modern gibt es da noch Cube-Funktionen.
Einzel-Summen lassen sich ggf. per scalarem Subselect ergänzen:

select Firma,Lieferschein, Datum, sum(Anz.pal)
from MyTable
Group by Firma, Lieferschein, Datum

BenderD
20-01-15, 12:34
...
order by firma, lieferschein,datum nicht vergessen

D*B

ExAzubi
20-01-15, 13:06
...
das Problem ist - welches mich doch sehr belastet ;) - ich kann bei SQL ja nicht mehr Detailfelder ausgeben als ich in der GROUP Anweisung habe, also nach euren Vorschlägen würden die Detaiinfos "Straße" "Ort" etc. im Result ja wegfallen...

So sollte das ResultSet aussehen, leider bekomme ich das nur hier per Hand hin :)


<tbody>
Firma

01

01

Lieferschein

4711
4711
4712
4712

Datum

23.01.2015

23.01.2015

23.01.2015

Kunden-Nr

4711

4711

Name

TEST

TEST

Straße

Musterweg

Musterweg

Ort

Musterdorf

Musterdorf

Artikel

4711

4712

Bezeichnung

Tst-Art

Tst-Art1

P-Fakt

64

32

Anz.Pal

15
15
13
13
28


</tbody>

BenderD
20-01-15, 13:17
... das ist weder ein "ResultSet" noch entspricht das einer sinnvollen Sortierung!

ansonsten kann man natürlich zusätzliche Felder in die Gruppierung aufnehmen und sie daurch in der Feldliste zugänglich machen.

...
Group by Firma, Lieferschein, Datum, Name, Straße, Ort

Fuerchau
20-01-15, 14:05
Du kannst die Felder in Group By aufnehmen (wie Dieter schon angibt), du kannst alternativ auch Aggregatfunktion MIN(Ort) nehmen, wenn der Ort für die Gruppe identisch ist.

Benötigst du allerdings sowohl die Einzelzeilen als auch die Summenzeilen musst du dich dochnäher mit der Cube-Anweisung beschäftigen.

ExAzubi
20-01-15, 14:14
Danke Furchau,

das war der Baum den ich im Wald nicht gesehen habe... Einfach ein paar Pseudo-Aggregatsfunktonen, dann sollte es in der Tat hinhauen.

I try it! :)

ExAzubi
22-01-15, 09:53
Hallo zusammen,

ich habe mich noch ein wenig weiter beschäftigt und bin zu der Lösung gekommen, die ich wollte :)

Das verwendete Statement sieht wie folgt aus.
In der CTE bilde ich mir die Summen auf die Felder die ich brauche. Die CTE ist die Basis und schon so aufgebaut, wie sie sollte: d.h. es gibt Summen dank des ROLLING-Befehl der Menge und Paletten auf alle Gruppenfelder aus: Artikel(ist eh schon atomar) auf den Lieferschein und auf das Datum und zuletzt auf die Firma.

Anchließend wird die CTE wieder mit der Lieferscheindatei gejoint (um weitere Informationen zum Lieferschein zu ermitteln) und auf andere Dateien wie Kundenstamm Artikelstamm, Kundenstamm etc.

Anhand der GROUPING-Indikatoren gehe ich hin und gebe anstelle der Artikelbezeichung die Summenbezeichung aus.

Läuft gut und ist asd was ich haben wollte..


WITH Summe AS(
SELECT
FIRM, DATUM, LIEFSCHNR, ARTNR, SUM(MENG)
SUM(ANZP),
GROUPING(DATUM) AS SUGES, GROUPING(LIEFSCHNR) AS SUDAT, GROUPiNG(ARTNR) AS SULS
FROM
LSNRDATEI
WHERE
FIRM='AA' AND AUFART='XX'
GROUP BY FIRM, DATUM, LIEFSCHNR, ARTIKEL
with ROLLUP
ORDER BY FIRM, DATUM, LIEFSCHNR, ARTIKEL)


SELECT A.FIRM, B.AUFTRAGNR, A.LIEFSCHNR, C.CCG, B.KUNDE, D.NAME, D.STRASSE, D.PLZ, D.ORT, A.DATUM, A.ARTNR,
CASE
WHEN A.SUDAT ='1' THEN 'Summe Datum : '
WHEN A.SULS ='1' THEN 'Summe Lieferschein:'
ELSE
C.ARTIKELBEZ
END,
A.MENGE,
C.PALF, A.ANZP, A.SUDAT, A.SULS, A.SUGES
FROM Summe A
LEFT JOIN LSNRDATEI B ON FIRM=FIRMA AND LIEFSCHNR=LSNR
LEFT JOIN ARTIKELDATEI C On FIRM =AFIRMA and ARTNR=AARTNR
LEFT JOIN KUNDENSTAMM D ON FIRM=KFIRMA AND KUNDE=KKUNDE