SQL Abfrage - dynamisches GROUP BY

Getting started ... Alles für einen gelungenen Start.
9 Beiträge • Seite 1 von 1
9 Beiträge Seite 1 von 1

SQL Abfrage - dynamisches GROUP BY

Beitrag von Tobias88 (ForumUser / 5 / 2 / 0 ) »
Hallo,

ich habe folgendes Problem.
Ich habe einen Report gemacht, der fakturierte Materialien eines bestimmten Werks über einen Zeitraum ausgibt.
Das klappt auch alles soweit.

Nun will ich dem Benutzer per Radio-Button die Wahl lassen, ob die Ausgabe nach Material gruppiert wird oder nicht.
Ist also "Radio-Button 1" gewählt, soll die SQL-Abfrage mit "GROUP BY ( groupby-list )" ausgeführt werden.
Ist "Radio-Button 2" gewählt, soll die gleiche SQL-Abfrage ohne "GROUP BY" ausgeführt werden.

Das man die group-list dynamisch gestalten kann ist mir klar, allerdings ist es ja nicht möglich, GROUP BY mit einer "leeren" group-list auszuführen.

Kann mir da jemand weiterhelfen?

Vielen Dank!
Gruß Tobias

gesponsert
Stellenangebote auf ABAPforum.com schalten
kostenfrei für Ausbildungsberufe und Werksstudenten


Re: SQL Abfrage - dynamisches GROUP BY

Beitrag von a-dead-trousers (Top Expert / 4399 / 223 / 1182 ) »
hi!

Ich würde sowas nicht auf der Datenbank, sondern am Appl.-Server mit SORT und DELETE ADJACENT DUPLICATES erledigen.
GROUP BY auf der Datenbank unterwandert nämlich den SAP Puffer.
Außerdem muss man bei Verwendung von GROUP BY evtl. die Feldliste beim SELECT anpassen, da ja nur die Felder des GROUP BY eindeutig sind und die anderen müssen mit Aggregatfunktionen ala. MAX oder MIN eingefasst werden.

Nichtsdestotrotz ist es bei der "dynamischen" SELECT-Variante möglich ein "leeres" GROUB BY zu haben und somit den Befehl zu "deaktivieren".

Code: Alles auswählen.

data:
  ld_group type string,
  lt_vbrp type standard table of vbrp with default key.
ld_group = 'VBELN'.
SELECT * FROM vbrp INTO TABLE lt_vbrp GROUP BY (ld_group). "Die erste Rechnungsposition
clear ld_group.
SELECT * FROM vbrp INTO TABLE lt_vbrp GROUP BY (ld_group). "Alle Rechnungspositionen 
lg ADT

Folgende Benutzer bedankten sich beim Autor a-dead-trousers für den Beitrag:
Tobias88

Theory is when you know something, but it doesn't work.
Practice is when something works, but you don't know why.
Programmers combine theory and practice: Nothing works and they don't know why.

ECC: 6.18
Basis: 7.50

Re: SQL Abfrage - dynamisches GROUP BY

Beitrag von Tobias88 (ForumUser / 5 / 2 / 0 ) »
Vielen Dank für die schnelle Antwort!
Ich werde es zunächst mit GROUP BY lösen, mir aber in den nächsten freien Minuten mal deine Vorschläge anschauen.

Re: SQL Abfrage - dynamisches GROUP BY

Beitrag von Tobias88 (ForumUser / 5 / 2 / 0 ) »
Als kleiner Nachtrag...

Die Antwort war zwas nicht die Lösung zu meinem Problem, hat mich aber auf die richtige Denkweise gebracht :)
Evtl. hatte ich mich auch falsch ausgedrückt.

(Vereinfacht) lese Ich aus der VBRK bzw VBRP die Rechnungen zu einem (oder mehreren) Material/ien aus. Die Fakturawerte sollen wahlweise einzeln mit jeder Position ausgegeben werden ODER nach Material gruppiert werden (es muss trotzdem am Ende der gleiche Fakturawert rauskommen, quasi als Summe).

Die vorgeschlagenen Werkzeuge waren nicht richtig, der Ansatz das auserhalb der SQL-Anweisung zu machen ist es aber. COLLECT table INTO table_group und der entsprechenden Definition von table_group ist die Lösung.

Nur zur komplettierung, falls jemand vor einem ähnlichen Problem steht ;)

Re: SQL Abfrage - dynamisches GROUP BY

Beitrag von a-dead-trousers (Top Expert / 4399 / 223 / 1182 ) »
Ich muss zu meiner Schande gestehen, dass sich mir bis heute die Sinnhaftigkeit/Funktionsweise des COLLECT nicht erschlossen hat.
Ich lass die Gruppierungen, sofern sich dadurch die Datenmenge die zwischen DB und Appl.Server übertragen wird signifikant verringern lässt, auf der Datenbank ausführen.
Für alle anderen Fälle, auch weil es man so weitaus flexibler ist, programmiere ich Gruppierungen immer selbst per Hand.
Dauert zwar länger, aber ich weiß genau was passiert und man kann es auch besser debuggen.

Nur meine 2 Cent als Anmerkung.
(Will hier auf keinen Fall einen Flamewar starten :P )
Theory is when you know something, but it doesn't work.
Practice is when something works, but you don't know why.
Programmers combine theory and practice: Nothing works and they don't know why.

ECC: 6.18
Basis: 7.50

Re: SQL Abfrage - dynamisches GROUP BY

Beitrag von Tobias88 (ForumUser / 5 / 2 / 0 ) »
Ich bin Anfänger bei ABAP und SAP und bin für jeden Tipp, jede Meinung und auch für jede Darbietung individueller Programmiervorlieben dankbar und offen!
Daher vielen Dank für die schnellen und häufigen Antworten :D

Kannst du nochmal erläutern, wie du die Gruppierung "per Hand" programmierst? Mit entsprechend mehr internen Tabellen?

Und noch eine Frage (wenn hierzu keine Antwort, suche ich nochmal woanders):
Ich habe gelesen, dass nicht nur GROUP BY sondern auch JOINS den SAP-Puffer unterwandern.
Ich nutze Joins -.- (bei allen bisherigen SQL-Lehrveranstaltungen war ein Join immer Mittel der Wahl)
Gibt es dazu andere, perfomantere Vorgehensweisen, wie z.B. jeden Inhalt der zu "joinenden" Tabellen in interne Tabellen laden und dann weiterverarbeiten?

Freue mich auf Neues :)

Re: SQL Abfrage - dynamisches GROUP BY

Beitrag von ewx (Top Expert / 4849 / 313 / 642 ) »
Tobias88 hat geschrieben: Nun will ich dem Benutzer per Radio-Button die Wahl lassen, ob die Ausgabe nach Material gruppiert wird oder nicht.
Wenn du deine Daten im ALV-Grid ausgibst, kann der Anwender doch sogar selbst nach Material gruppieren. Das kann als Variante abgespeichert werden und steht auf Knopfdruck zur Verfügung.

Re: SQL Abfrage - dynamisches GROUP BY

Beitrag von a-dead-trousers (Top Expert / 4399 / 223 / 1182 ) »
Tobias88 hat geschrieben:Kannst du nochmal erläutern, wie du die Gruppierung "per Hand" programmierst? Mit entsprechend mehr internen Tabellen?
z.B. mit LOOP AT und Gruppenstufenverarbeitung wenn man nur auf ein Feld die Gruppierung macht

Code: Alles auswählen.

LOOP AT ... ASSIGNING <ls_line>
AT NEW feld
* Beginn einer neuen Gruppe
ENDAT.
* Verarbeitung der Daten
ENDLOOP.
Oder mithilfe eines Vergleiches wobei man hier mehrere Felder gleichzeitig abfragen kann.

Code: Alles auswählen.

LOOP AT ... ASSIGNING <ls_line>.
IF ls_line-feld NE <ls_line>-feld.
* Beginn einer neuen Gruppe
  ls_line = <ls_line>.
ENDIF.
* Verarbeitung der Daten
ENDLOOP.
Tobias88 hat geschrieben:Und noch eine Frage (wenn hierzu keine Antwort, suche ich nochmal woanders):
Ich habe gelesen, dass nicht nur GROUP BY sondern auch JOINS den SAP-Puffer unterwandern.
Stimmt!
Tobias88 hat geschrieben:Ich nutze Joins -.- (bei allen bisherigen SQL-Lehrveranstaltungen war ein Join immer Mittel der Wahl)
Gibt es dazu andere, perfomantere Vorgehensweisen, wie z.B. jeden Inhalt der zu "joinenden" Tabellen in interne Tabellen laden und dann weiterverarbeiten?
Wie so oft, gibt es hier leider keine klare Aussage. Je nachdem wie die Datenstruktur aufgebaut ist, ist seitens Datenbank entweder ein JOIN oder eine Einzel Abfrage besser.
Ich würde sagen, wenn die Daten größtenteils 1:1 Beziehungen beinhalten ist ein JOIN besser, weil die vielen Einzel Abfragen so auf der DB gebündelt werden können ohne das Netzwerk bzw. den ApplServer zu belasten.
Sobald jedoch die Daten mehr in Richtung 1:N abdriften ist es besser die Abfragen als Einzel Abfragen zu gestalten, weil so die vielen gleichen Datenfelder nicht für jeden Datensatz übertragen werden müssen, sondern nur einmal für jedes tatsächliche Vorkommen. Auch können auf diesem Wege die Puffer ausgenutzt werden.

Wenn man bei den Abfragen anstatt JOIN ein FOR ALL ENTRIES verwendet, muss man berücksichtigen, dass die Tabelle nicht leer sein darf und kein Wert doppelt vorkommt.

lg ADT

Folgende Benutzer bedankten sich beim Autor a-dead-trousers für den Beitrag:
Tobias88

Theory is when you know something, but it doesn't work.
Practice is when something works, but you don't know why.
Programmers combine theory and practice: Nothing works and they don't know why.

ECC: 6.18
Basis: 7.50

Re: SQL Abfrage - dynamisches GROUP BY

Beitrag von Unit605 (Expert / 975 / 37 / 93 ) »
a-dead-trousers hat geschrieben:Ich muss zu meiner Schande gestehen, dass sich mir bis heute die Sinnhaftigkeit/Funktionsweise des COLLECT nicht erschlossen hat.
Ich lass die Gruppierungen, sofern sich dadurch die Datenmenge die zwischen DB und Appl.Server übertragen wird signifikant verringern lässt, auf der Datenbank ausführen.
Für alle anderen Fälle, auch weil es man so weitaus flexibler ist, programmiere ich Gruppierungen immer selbst per Hand.
Dauert zwar länger, aber ich weiß genau was passiert und man kann es auch besser debuggen.

Nur meine 2 Cent als Anmerkung.
(Will hier auf keinen Fall einen Flamewar starten :P )
Betrifft das jetzt nur den COLLECT Befehlt oder auch andere?

Was ist am Selbstgestrickten den so flexibler, wenn der COLLECT Befehl genau das macht, was ich von ihm erwartet und den Befehl genau deshalb nutze?

Das koennte man jetzt auch auf jeden anderen Befehl, FuBa oder Methode erweitern und sagen, das mach ich lieber per Hand. Oder?

Seite 1 von 1

Vergleichbare Themen

1
Antw.
3523
Views
SQL Abfrage - group by funktioniert nicht
von b0rsti » 16.06.2008 10:42 • Verfasst in ABAP® für Anfänger
3
Antw.
1308
Views
SQL- Group-Funktion
von Emily » 14.06.2005 14:59 • Verfasst in Basis
1
Antw.
1329
Views
Itab Group by
von Bajdu » 03.10.2006 13:50 • Verfasst in ABAP® für Anfänger
3
Antw.
2014
Views
Group by Zähler
von gs3rr4 » 16.07.2015 10:42 • Verfasst in ABAP® für Anfänger
4
Antw.
6941
Views
Group by auf interne Tabelle
von b0rsti » 12.06.2008 14:56 • Verfasst in ABAP® für Anfänger

Über diesen Beitrag


Unterstütze die Community und teile den Beitrag für mehr Leser und Austausch

Aktuelle Forenbeiträge

Regex in where
vor 7 Stunden von edwin 7 / 163
Daten an Tabelle binden
vor 20 Stunden von Bright4.5 3 / 1487

Newsletter Anmeldung

Keine Beiträge verpassen! Wöchentlich versenden wir lesenwerte Beiträge aus unserer Community.
Die letzte Ausgabe findest du hier.
Details zum Versandverfahren und zu Ihren Widerrufsmöglichkeiten findest du in unserer Datenschutzerklärung.

Aktuelle Forenbeiträge

Regex in where
vor 7 Stunden von edwin 7 / 163
Daten an Tabelle binden
vor 20 Stunden von Bright4.5 3 / 1487

Unbeantwortete Forenbeiträge

aRFC im OO-Kontext
vor 5 Wochen von ralf.wenzel 1 / 3261
Hilfe bei SWEC/SWE2
September 2024 von retsch 1 / 9822