Seite 1 von 1

SQL Abfrage: zusätzliche Spalte mit zweiter where Bedingung

BeitragVerfasst: Do 15. Jun 2017, 09:34
von Budy
Hallo

Bin neu hier und auch ein Anfänger was SQL Abfragen betrifft.

Ich habe eine Datenbank (PostgreSQL) bei welcher ich folgende Abfrage mache:
Code: Alles auswählen
SELECT
  mitarbeiterkonten.sachb,
  sachbearbeiter.name,
  sachbearbeiter.vorname,
  sachbearbeiter.abteilung,
  kontoarten.bezeichnung,
  mitarbeiterkonten.saldo_aktjahr AS "Überzeit"
FROM
  mitarbeiterkonten
  INNER JOIN sachbearbeiter ON sachbearbeiter.sachb = mitarbeiterkonten.sachb
  INNER JOIN kontoarten ON kontoarten.kontoart = mitarbeiterkonten.kontoart
WHERE
  mitarbeiterkonten.kontoart = 'SAL' AND
  mitarbeiterkonten.abschl_datum IS NULL AND
  sachbearbeiter.austrittsdatum IS NULL AND
  sachbearbeiter.geloescht = 'N'
GROUP BY
  mitarbeiterkonten.sachb,
  sachbearbeiter.name,
  sachbearbeiter.vorname,
  sachbearbeiter.abteilung,
  kontoarten.bezeichnung,
  mitarbeiterkonten.saldo_aktjahr,
  mitarbeiterkonten.kontoart,
  mitarbeiterkonten.abschl_datum,
  sachbearbeiter.austrittsdatum,
  sachbearbeiter.geloescht
ORDER BY
  sachbearbeiter.name,
  sachbearbeiter.vorname


Das Resultat ist eine Tabelle mit folgenden Spalten:
Sachb/Name/Vorname/Abteilung/Bezeichnung/Überzeit

Die Spalte Überzeit wird definiert durch "mitarbeiterkonten.saldo_aktjahr" und die where Bedingung "mitarbeiterkonten.kontoart = 'SAL'"

Was muss ich machen, damit ich eine zusätzliche Spalte "Überstunden" im Resultat in der selben Zeile zum jeweiligen Sachbearbeiter "Sachb" erhalte? (Hier muss die Bedingung beim where "mitarbeiterkonten.kontoart = 'UE1'" sein)

Vielen Dank schon mal im Voraus für euere Hilfe.

Philipp

Re: SQL Abfrage: zusätzliche Spalte mit zweiter where Beding

BeitragVerfasst: Do 15. Jun 2017, 17:17
von SQLUnion
Hallo Budy,

willkommen im Forum.
Wenn ich deine Frage richtig verstehe, dann könntest Du ein CASE WHEN-Statement einsetzen:

Code: Alles auswählen
SELECT
  mitarbeiterkonten.sachb,
  sachbearbeiter.name,
  sachbearbeiter.vorname,
  sachbearbeiter.abteilung,
  kontoarten.bezeichnung,
  mitarbeiterkonten.saldo_aktjahr AS "Überzeit",
 CASE WHEN mitarbeiterkonten.kontoart = 'UE1' THEN 'JA' ELSE 'NEIN' AS Ueberstunden
...


Gruß,
SQLUnion

Re: SQL Abfrage: zusätzliche Spalte mit zweiter where Beding

BeitragVerfasst: Mo 19. Jun 2017, 10:11
von Budy
Hallo SQLUnion

Erstmal vielen Dank für die rasche Antwort.
Ich bin mir nicht ganz sicher ob dein Ansatz funktioniert, da es für die " mitarbeiterkonten.kontoart" nicht nur SAL und UE1 gibt, sondern auch noch etliche anderen. Ich möchte einfach nur diese zwei auswerten.
Du kannst dir meine SQL Abfrage so vorstellen, dass ich diese mometan zwei mal mit unterschiedlicher where Bedingung (einmal mitarbeiterkonten.kontoart = 'SAL' und einmal mitarbeiterkonten.kontoart = "UE1" ausführe. Ich habe also zwei Abfragen.
Was ich nun möchte ist eine Abfrage, welche beide Resultate in unterschiedlichen Spalten ergibt (und dies pro Sachbearbeiter).
Das Resultat wäre dann eine Tabelle mit folgenden Spalten:
Sachb/Name/Vorname/Abteilung/Bezeichnung/Überzeit/Überstunden

Hoffe es hiermit etwas klarer formuliert zu haben.

Wenn ich deinen Vorschlag eins zu eins in meine Abrage einbaue:

SELECT
mitarbeiterkonten.sachb,
sachbearbeiter.name,
sachbearbeiter.vorname,
sachbearbeiter.abteilung,
kontoarten.bezeichnung,
mitarbeiterkonten.saldo_aktjahr AS "Überzeit",
CASE WHEN mitarbeiterkonten.kontoart = 'UE1' THEN 'JA' ELSE 'NEIN' AS Ueberstunden
FROM
mitarbeiterkonten
INNER JOIN sachbearbeiter ON sachbearbeiter.sachb = mitarbeiterkonten.sachb
INNER JOIN kontoarten ON kontoarten.kontoart = mitarbeiterkonten.kontoart
WHERE
mitarbeiterkonten.kontoart = 'SAL' AND
mitarbeiterkonten.abschl_datum IS NULL AND
sachbearbeiter.austrittsdatum IS NULL AND
sachbearbeiter.geloescht = 'N' AND
mitarbeiterkonten.sachb = 'PW'
GROUP BY
mitarbeiterkonten.sachb,
sachbearbeiter.name,
sachbearbeiter.vorname,
sachbearbeiter.abteilung,
kontoarten.bezeichnung,
mitarbeiterkonten.saldo_aktjahr,
mitarbeiterkonten.kontoart,
mitarbeiterkonten.abschl_datum,
sachbearbeiter.austrittsdatum,
sachbearbeiter.geloescht
ORDER BY
sachbearbeiter.name,
sachbearbeiter.vorname


So erhalte ich folgende Fehlermeldung:
Invalid Select statement. Unexpected token «AS» at line8, pos 69

Vielen Dank für deine Hilfe.

Gruss

Budy



SQLUnion hat geschrieben:Hallo Budy,

willkommen im Forum.
Wenn ich deine Frage richtig verstehe, dann könntest Du ein CASE WHEN-Statement einsetzen:

Code: Alles auswählen
SELECT
  mitarbeiterkonten.sachb,
  sachbearbeiter.name,
  sachbearbeiter.vorname,
  sachbearbeiter.abteilung,
  kontoarten.bezeichnung,
  mitarbeiterkonten.saldo_aktjahr AS "Überzeit",
 CASE WHEN mitarbeiterkonten.kontoart = 'UE1' THEN 'JA' ELSE 'NEIN' AS Ueberstunden
...


Gruß,
SQLUnion

Re: SQL Abfrage: zusätzliche Spalte mit zweiter where Beding

BeitragVerfasst: Fr 23. Jun 2017, 21:28
von SQLUnion
Hi Budy,

der neue CASE WHEN-Teil muss natürlich auch in den Group By Statement-Bereich,
dann sollte das klappen.

Gruß,
SQLUnion

Re: SQL Abfrage: zusätzliche Spalte mit zweiter where Beding

BeitragVerfasst: Di 27. Jun 2017, 16:41
von Budy
Hallo SQLUnion

Vielen Dank für deine Antwort.

Die Fehlermeldung die ich erhalten habe war, so denke ich, weil nach dem Case when kein End gestanden hat.
Mit dem Group By hast du natürlich Recht.

Ich habe die Abfrage nun so gemacht:
SELECT
mitarbeiterkonten.sachb,
sachbearbeiter.name,
sachbearbeiter.vorname,
sachbearbeiter.abteilung,
CASE WHEN mitarbeiterkonten.kontoart = 'SAL' THEN mitarbeiterkonten.saldo_aktjahr END AS "Überstunden",
CASE WHEN mitarbeiterkonten.kontoart = 'UE1' THEN mitarbeiterkonten.saldo_aktjahr END AS "Überzeit"
FROM
mitarbeiterkonten
INNER JOIN sachbearbeiter ON sachbearbeiter.sachb = mitarbeiterkonten.sachb
INNER JOIN kontoarten ON kontoarten.kontoart = mitarbeiterkonten.kontoart
GROUP BY
mitarbeiterkonten.sachb,
sachbearbeiter.name,
sachbearbeiter.vorname,
sachbearbeiter.abteilung,
CASE WHEN mitarbeiterkonten.kontoart = 'SAL' THEN mitarbeiterkonten.saldo_aktjahr END,
CASE WHEN mitarbeiterkonten.kontoart = 'UE1' THEN mitarbeiterkonten.saldo_aktjahr END,
mitarbeiterkonten.abschl_datum,
sachbearbeiter.austrittsdatum,
sachbearbeiter.geloescht
HAVING
mitarbeiterkonten.abschl_datum IS NULL AND
sachbearbeiter.austrittsdatum IS NULL AND
sachbearbeiter.geloescht = 'N' AND
mitarbeiterkonten.sachb = 'PW'
ORDER BY
sachbearbeiter.name,
sachbearbeiter.vorname

Dies funktioniert soweit...bekomme noch 2 Zeilen anstatt einer aber das löse ich noch.

Budy