Vinzenz Mai: Verschachtelt SUM(COUNT()) ?

Beitrag lesen

Hallo Paul,

um die Kritik zu konkretisieren:

Beispiel:

t_aussendienst, t_chef, t_innnendienst

Nun möchte ich gerne alle Gehälter jeder Tabelle zählen (count)
und anschließend diese summieren.

Offensichtlich existieren Daten in drei Tabellen statt in einer. Sieht derzeit nach fehlerhaftem Datenbankdesign aus.

Nehmen wir jetzt an, Du hättest
4 Einträge in der Chefetage,
250 Einträge im Innendienst und
1000 Einträge im Außendienst.

SELECT
sum(
count(t_aussendienst.gehalt) +
count(t_chef.gehalt) +
count(t_innendienst.gehalt)
)
FROM t_aussendienst, t_chef, t_innnendienst
WHERE Gehalt > 450;

Dann hätte

  
SELECT  
    a.gehalt,  
    c.gehalt,  
    i.gehalt  
FROM t_aussendienst a, t_chef c, t_innendienst  

eine Million Einträge (wegen des CROSS JOINS):

Jeder Eintrag aus dem Bereich Chef wird mit jedem Eintrag aus dem Bereich Außendienst und jede dieser Kombinationen wieder mit jedem Eintrag aus dem Bereich Innendienst kombiniert.

Auf welche Spalte gehalt soll nun Deine WHERE-Klausel wirken?

Statt dessen solltest Du im ersten Schritt Dein fehlerhaftes Datenbankdesign mit einer UNION korrigieren:

  
SELECT  
    gehalt  
FROM t_aussendienst  
WHERE gehalt > 450  
  
UNION ALL           -- damit Du auch doppelte Werte bekommst  
                    -- wenn zwei das gleiche verdienen.  
SELECT  
    gehalt  
FROM t_chef  
WHERE gehalt > 450  -- Die WHERE-Klausel ist in jedem Einzelstatement anzugeben  
  
UNION ALL  
SELECT  
    gehalt  
FROM t_innendienst  
WHERE gehalt > 450  

Kannst Du Dir jetzt die weiteren Schritte vorstellen?

Freundliche Grüße

Vinzenz