[NEWSboard IBMi Forum]
  1. #1
    Registriert seit
    Apr 2005
    Beiträge
    385

    SQL mit Teilergebnis

    Hallo zusammen,

    ich habe ein SQL mit folgenden Spalten
    Firma Lieferschein Datum Kunden-Nr Name Straße Ort Artikel Bezeichnung P-Fakt Anz.Pal


    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.

  2. #2
    Registriert seit
    Feb 2001
    Beiträge
    20.241
    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
    Dienstleistungen? Die gibt es hier: http://www.fuerchau.de
    Das Excel-AddIn: https://www.ftsolutions.de/index.php/downloads
    BI? Da war doch noch was: http://www.ftsolutions.de

  3. #3
    Registriert seit
    Mar 2002
    Beiträge
    5.287
    ...
    order by firma, lieferschein,datum nicht vergessen

    D*B
    AS400 Freeware
    http://www.bender-dv.de
    Mit embedded SQL in RPG auf Datenbanken von ADABAS bis XBASE zugreifen
    http://sourceforge.net/projects/appserver4rpg/

  4. #4
    Registriert seit
    Apr 2005
    Beiträge
    385
    ...
    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

    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

  5. #5
    Registriert seit
    Mar 2002
    Beiträge
    5.287
    ... 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
    AS400 Freeware
    http://www.bender-dv.de
    Mit embedded SQL in RPG auf Datenbanken von ADABAS bis XBASE zugreifen
    http://sourceforge.net/projects/appserver4rpg/

  6. #6
    Registriert seit
    Feb 2001
    Beiträge
    20.241
    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.
    Dienstleistungen? Die gibt es hier: http://www.fuerchau.de
    Das Excel-AddIn: https://www.ftsolutions.de/index.php/downloads
    BI? Da war doch noch was: http://www.ftsolutions.de

  7. #7
    Registriert seit
    Apr 2005
    Beiträge
    385
    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!

  8. #8
    Registriert seit
    Apr 2005
    Beiträge
    385
    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..
    Code:
    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

Tags for this Thread

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • You may not post attachments
  • You may not edit your posts
  •