SQL - Zeilen in Spalte umwandeln

winscheil

Cadet 1st Year
Registriert
Apr. 2017
Beiträge
14
Hallo,
ich habe folgende SQL Auswertung:

Artikel Grundpreis Staffelmenge Staffelpreis
ABC 20 5 18
ABC 20 50 15
ABC 20 100 12
DEF 50 50 40
XYZ 30 20 25
XYZ 30 100 20

Und bräuchte die Staffelmengen und Preise je Artikel augeteilt in Spalten in einer Zeile:

Artikel Grundpreis SM1 SP1 SM2 SP2 SM3 SP3 SM4 SP4
ABC 20 5 18 50 15 100 12 NULL NULL
DEF 50 50 40 NULL NULL NULL NULL NULL NULL
XYZ 30 20 25 100 20 NULL NULL NULL NULL

Ich hoffe, ich habe mein Problem verständlich dargestellt.
Kann mir dazu einer helfen?
 
ich hab schon etwas rum gegoogelt und einer hat was von group by und Max() geschrieben.
da hab ich rumprobiert. Aber es noch nicht hinbekommen
 
Was für eine Datenbank nutzt du? Mache DBs bieten pivot/unpivot Funktionen.

Du musst ggf. die Zeilen pro Artikel noch Nummerieren, über ROW_NUMBER() OVER (PARTITION BY Artikel ORDER BY Staffelmenge ASC) in einer Sub-Query.

Wenn du fertige Funktionen auskommen möchtest, musst du nach Artikel, Grundpreis gruppieren und für jede Spalte den Code ca. so anpassen (Beispiel für SM1, rowNo ist das Ergebnis der Subquery):
MAX(CASE WHEN rowNo = 1 THEN Staffelpreis END) AS SP1,
 
Ist die Anzahl der spalten Fix oder dynamisch?

Davon ab, wofür brauchst Du das Ergebnis später? Denn prinzipiell macht es Sinn eine ausnormalisierte Tabelle in der Struktur zu belassen, außer die abnehmende Applikation kommt damit nicht zurecht.
 
Ich würd die Spalten fix machen. Also 4 Rabattmengen und 4 Rabattpreise. Wenn dann bei manchen Artikeln nur 2 oder 3 Rabatte drin stehen, dann soll NULL in den Spalten stehen. Es ist aber definitiv so, dass es bei den Artikeln unterschiedlich viele Rabatte gibt.
Ich brauch das für Artikellieferantenbewertung.
 
Sofern du auf MS SQL Server unterwegs bist geht das mit Pivotierung, auf MS Support Seiten gibt es dazu Beispiele. Da dein Fall nicht besonders kompliziert ist solltest du damit hoffentlich zurechtkommen :)
 
winscheil schrieb:
Ich würd die Spalten fix machen. Also 4 Rabattmengen und 4 Rabattpreise. Wenn dann bei manchen Artikeln nur 2 oder 3 Rabatte drin stehen, dann soll NULL in den Spalten stehen. Es ist aber definitiv so, dass es bei den Artikeln unterschiedlich viele Rabatte gibt.
Ich brauch das für Artikellieferantenbewertung.

4 feste Spalten ist doch super. Benutze eine Window function wie bspw rank und baue das mit self joins und einem Filter auf den Rank 1 - 4 zusammen. Sollte vom Gefühl her den besten execution plan ergeben.

Pivot und unpivot ist einen Versuch Wert, aber allgemein relativ Lahm.
 
So kompliziert musst du nicht arbeiten.

Wenn du mit MSSQL arbeitest, würde ich es nur mit Filtern machen, also WHERE
 
Zurück
Oben