Inline View mit Union

xlumia

Benutzer
Beiträge
7
Ich möchte mit meinem SQL zählen, wieviele an einem Montag, Dienstag etc geboren sind.
Ausgabe soll in einer Zeile erfolgen, die Spalten Namen sollen Montag, Diestag, Mittwoch etc sein.
Bei meinem Statement werden nur die gezählt, die an einem Sonntag geboren sind.
Was mache ich falsch?

select * from
(select count(GEB_DATE) as montag, 0 as dienstag, 0 as mittwoch, 0 as donnerstag, 0 as freitag, 0 as samstag, 0 as sonntag from EMPLOYEES where to_char(HIRE_DATE, 'DAY') = 'MONTAG '
union
select 0, count(GEB_DATE), 0, 0, 0, 0, 0 from PERSONEN where to_char(GEB_DATE, 'DAY') = 'DIENSTAG'
union
select 0, 0, count(GEB_DATE), 0, 0, 0, 0 from PERSONEN where to_char(GEB_DATE, 'DAY') = 'MITTWOCH'
union
select 0, 0, 0, count(GEB_DATE), 0, 0, 0 from PERSONEN where to_char(GEB_DATE, 'DAY') = 'DONNERSTAG'
union
select 0, 0, 0, 0, count(GEB_DATE), 0, 0 from PERSONEN where to_char(GEB_DATE, 'DAY') = 'FREITAG'
union
select 0, 0, 0, 0, 0, count(GEB_DATE), 0 from PERSONEN where to_char(GEB_DATE, 'DAY') = 'SAMSTAG'
union
select 0, 0, 0, 0, 0, 0, count(GEB_DATE) from PERSONEN where to_char(GEB_DATE, 'DAY') = 'SONNTAG'
)
 
Werbung:
Hi, versuch es mal damit

Code:
SELECT
    SUM(IF(WEEKDAY(GEB_DATE) = 0 , 1, 0)) AS Montag,
    SUM(IF(WEEKDAY(GEB_DATE) = 1 , 1, 0)) AS Dienstag,
    SUM(IF(WEEKDAY(GEB_DATE) = 2 , 1, 0)) AS Mittwoch,
    SUM(IF(WEEKDAY(GEB_DATE) = 3 , 1, 0)) AS Donnerstag,
    SUM(IF(WEEKDAY(GEB_DATE) = 4 , 1, 0)) AS Freiteg,
    SUM(IF(WEEKDAY(GEB_DATE) = 5 , 1, 0)) AS Samstag,
    SUM(IF(WEEKDAY(GEB_DATE) = 6 , 1, 0)) AS Sonntag
FROM EMPLOYEES;
 
Werbung:
Was mache ich falsch?

Die Lösung hast Du ja schon, um noch zu sagen, was Du falsch gemacht hast: Du vertraust einer DB, die bei syntaktisch falsch gestellten Abfragen statt eines Fehlers (was logisch und richtig wäre) einfach mal falsche Ergebnisse liefert. Was ist syntaktisch falsch? Nun, du aggregierst (count) in jedem Deiner einzelnen Selects. Das ist nicht falsch, aber dann müssen alle anderen Spalten entweder auch aggregiert ODER GRUPPIERT werden. Keines davon ist der Fall.

Um es man nachzuspielen:

Code:
test=# create table dates(id int primary key, name text, d date);
CREATE TABLE
test=*# select *, count(d) from dates;
FEHLER:  Spalte »dates.id« muss in der GROUP-BY-Klausel erscheinen oder in einer Aggregatfunktion verwendet werden
ZEILE 1: select *, count(d) from dates;

PostgreSQL liefert hier einen Fehler, MySQL was zufälliges, völlig falsches.

Viel Spaß noch damit.
 
Zurück
Oben