PDA

View Full Version : Sortieren mit SQL



Joe
06-02-08, 09:27
Hallo Forum
Die folgende Subfile soll in SQLRPGLE nach Betrag aufsteigen oder absteigend sortiert werden.
Dabei ist die jeweils niedrigste "Stufe2" aller Sätze massgebend. Die Sortierung soll aber auch
innerhalb der gleichen "Stufe1" wirken.
Dazu gebe ich eine Tabelle mit gleichem Aufbau aus die nach dem sortieren wieder eingelesen und angezeigt wird.



Stufe1 Stufe2 Krit BETRAG
1 4 ||||Artikel 55 2,81
1 4 ||||Artikel 56 85,00
1 4 ||||Artikel 57 41,94
1 4 ||||Artikel 58 41,38
1 3 |||Auftragsart 50 171,13
1 2 ||Monat 01 171,13
1 1 |Kunde 1100 171,13

2 4 ||||Artikel 40 20,08
2 4 ||||Artikel 41 100,42
2 4 ||||Artikel 56 59,46
2 3 |||Auftragsart 01 179,96
2 2 ||Monat 01 179,96
2 1 |Kunde 1101 179,96



nach der Sortierung soll das so aussehen

Stufe1 Stufe2 Krit BETRAG
2 4 ||||Artikel 41 100,42
2 4 ||||Artikel 56 59,46
2 4 ||||Artikel 40 20,08
2 3 |||Auftragsart 01 179,96
2 2 ||Monat 01 179,96
2 1 |Kunde 1101 179,96


1 4 ||||Artikel 56 85,00
1 4 ||||Artikel 57 41,94
1 4 ||||Artikel 58 41,38
1 4 ||||Artikel 55 2,81
1 3 |||Auftragsart 50 171,13
1 2 ||Monat 01 171,13
1 1 |Kunde 1100 171,13

Wie bekomme ich das mit einer dynamischen sqL-Anweisung hin?

Gruß Joe[/FONT]

woki
07-02-08, 13:48
Meinst du vielleicht:

1. Sortierung

Select FeldA, FeldB, FeldC, ...
From TabelleA
Where ...
Order by 1 asc, 2 desc2. Sortierung

Select FeldA, FeldB, FeldC, ...
From TabelleA
Where ...
Order by 1 desc, 2 desc 1. Du erstellst das SQL-Select-Statement als String.
MySQLStm = 'SELECT ..... '
2. Du generierst ein ausführbares SQL-Statement über den SQL Prepare-Befehl:
/EXEC SQL Prepare MySQLCmd from :MySQLStm
/END-EXEC
3. Du deklarierst einen Cursor, in dem Du statt des SQL-Statements den aufbereiteten SQL-Command angibst:
/EXEC SQL Declare MyCursor For MySQLCMD
/END-EXEC

Fuerchau
07-02-08, 13:57
Das Problem hier ist eher die 2-stufige Sortierung.

Hierfür musst du ein temporäres Zwischenergebnis erstellen, dass du dann für die Sortierung wieder verknüpfst:

with
xGroupSum as (
select kunde, sum(Umsatz) as GUmsatz
from MyFile
group by Kunde)

select a.Kunde, Artikel, min(GUmsatz) as GUmsatz, sum(Umsatz) as AUmsatz A
from myfile inner join xGroupSum B on a.Kunde=B.Kunde
group by Kunde, Artikel
order by GUmsatz, AUmsatz, Kunde

Je nach Schachtelungstiefe benötigst du entsprechend viele Zwischenergebnisse und Verknüpfungen.

Performance ?
Naja, das muss man ausprobieren.

Joe
11-02-08, 14:02
Das Problem hier ist eher die 2-stufige Sortierung.

Hierfür musst du ein temporäres Zwischenergebnis erstellen, dass du dann für die Sortierung wieder verknüpfst:

with
xGroupSum as (
select kunde, sum(Umsatz) as GUmsatz
from MyFile
group by Kunde)

select a.Kunde, Artikel, min(GUmsatz) as GUmsatz, sum(Umsatz) as AUmsatz A
from myfile inner join xGroupSum B on a.Kunde=B.Kunde
group by Kunde, Artikel
order by GUmsatz, AUmsatz, Kunde

Je nach Schachtelungstiefe benötigst du entsprechend viele Zwischenergebnisse und Verknüpfungen.

Performance ?
Naja, das muss man ausprobieren.

Vielen Dank für den Lösungsansatz.

Da die Schachtelungstiefe > 30 sein kann, habe ich mich für
eine "abgespeckte" Version entschieden bei der der Benutzer die Sortierstufe vorgibt. Nur diese wird dann verwendet und angezeigt.

Gruß Joe