[MSSQL] Spalteninhalt als Spalte darstellen

Fragenfrager

Erfahrenes Mitglied
Hallo liebes Forum,

ich entschuldige mich schonmal für den verwirrenden Titel, aber sinnvoller kann ich mein Problem nicht zusammfassen.
Ich habe eine vorgegebene Tabelle [Abrechnung] mit dem Aufbau:

Personalnummer(pnr)| Lohnart (la) | Betrag | Abrechnungszeitraum(az)


Eine Person kann dabei mehrer Loharten pro Abrechnungszeitraum erhalten. Es sind mehrere Lohnarten vorhanden, zB könnte der Inhalt so aussehen:

1 | BBM | 99,75 | 01-2012
1 | BBM | 100,00 | 02-2012
1 | BRG | 71,50 | 02-2012
1 | RRD | 52,50 | 02-2012
2 | BBM | 95,25 | 01-2012
2 | BRG | 65,65 | 02-2012
2 | RRD | 47,20 | 02-2012

Ziel soll es sein, zu einem bestimmten Zeitraum (z.B. 02-2012) folgende Auswerrtung zu erhalten:

pnr | Betrag von Lohnart BBM | Betrag von Lohnart BRG | Betrag von Lohnart RRD
1 | 100,00 | 71,50 | 52,50
2 | % | 65,65 | 47,20

Wie bekomme ich die Beträge der Lohnarten als Spalten?

Vielen Dank im Voraus für Lösungsansätze.
 
MS SQL kenn ich gard nicht. Das Ding das du suchst heisst Crossquery oder Pivot-Query
Auf die Schnelle mit Google gefunden:
http://archive.msdn.microsoft.com/S...le=PIVOT Data in SQL 2005&referringTitle=Home

Ansonsten geht in den meisten SQL-Sprachen (min. Oracle und MySQL) das folgende Konzept
SQL:
SELECT
    pnr
    -- Anstelle von CASE ists bei einigen DBMS auch IF(), IIF() oder sonst so was ähnliches
    SUM(CASE WHEN la='BBM' THEN betrag ELSE 0 END) AS sum_bbm,
    SUM(CASE WHEN la='BRG' THEN betrag  ELSE 0 END) AS sum_brg,	
    SUM(CASE WHEN la='RRD' THEN betrag  ELSE 0 END) AS sum_rrd
FROM
    mytable
-- WHERE az = 02-2012      Keine Ahnung wie der Datumsvergleich in MS SQL aussieht
GROUP BY
    pnr;
 
Zuletzt bearbeitet von einem Moderator:
Das hat schonmal geholfen, danke. Der Datumsvergleich in MSSQL wäre hier
SQL:
where az='2012-02'
Es bleibt noch ein Problem: in der WHERE-Klausel hätte ich gerne etwas wie
SQL:
WHERE 
 sum_brg>0
Ziel ist, dass Personalnummern, bei denen das Ergbnis aus
SQL:
SUM(CASE WHEN la='BRG' THEN betrag  ELSE 0 END)
0 ist, nicht mit auftauchen.
Leider erhalte ich den Hinweis, dass sum_brg keine gültige Spalte sei.
Hast Du hierzu noch eine einfache Lösung?
 
HAVING. HAVING suchst du.

WHERE prüft auf Detailebene
HAVING prüft auf Gruppeneben

SQL:
SELECT
    pnr
    -- Anstelle von CASE ists bei einigen DBMS auch IF(), IIF() oder sonst so was ähnliches
    SUM(CASE WHEN la='BBM' THEN betrag ELSE 0 END) AS sum_bbm,
    SUM(CASE WHEN la='BRG' THEN betrag  ELSE 0 END) AS sum_brg, 
    SUM(CASE WHEN la='RRD' THEN betrag  ELSE 0 END) AS sum_rrd
FROM
    mytable
WHERE
    az='2012-02'
GROUP BY
    pnr
HAVING
    -- Bei einigen DBMS kann man hier direkt auf den Alias zugeiffen.
    -- sum_brg>0
    SUM(CASE WHEN la='BRG' THEN betrag  ELSE 0 END)  > 0;
 
Zuletzt bearbeitet von einem Moderator:

Neue Beiträge

Zurück