2009-08-08 5 views
1

Ich habe eine MEMBERS Tabelle mit den folgenden relevanten Spalten:Wie kann ich Aggregationsergebnisse aus mehreren SQL SELECTS zusammenführen?

Name 
JoinDate 
Level --1=Gold,2=Silver,3=Bronze** 

Ich mag eine einzelne Abfrage erstellen, eine Mitgliedschaft Zusammenfassung zurückzugeben, die die Gesamtzahl aufgeführt, die nach Jahr und Mitgliedschaftsstufe verbunden. Grundsätzlich wären die Spalten in meinem resultset so etwas wie diese:

| YEAR | GOLD | SILVER | BRONZE | TOTAL | 

Ich konnte die verschiedenen Zählungen pro Jahr für Gold-bekommen, Silber und Bronze Mitglieder jeweils die folgenden drei Abfragen mit:

SELECT YEAR(JoinDate) AS YEAR, COUNT(*) AS GOLD FROM Members 
WHERE Level=1 GROUP BY YEAR(JoinDate) ORDER BY YEAR(JoinDate) 

SELECT YEAR(JoinDate) AS YEAR, COUNT(*) AS SILVER FROM Members 
WHERE Level=2 GROUP BY YEAR(JoinDate) ORDER BY YEAR(JoinDate) 

SELECT YEAR(JoinDate) AS YEAR, COUNT(*) AS BRONZE FROM Members 
WHERE Level=3 GROUP BY YEAR(JoinDate) ORDER BY YEAR(JoinDate) 

I könnte auch die Summen unter Verwendung einer ähnlichen Abfrage erhalten:

SELECT YEAR(JoinDate) AS YEAR, COUNT(*) AS TOTAL FROM Members 
GROUP BY YEAR(JoinDate) ORDER BY YEAR(JoinDate) 

Mein Problem ist, ich einen Weg, nicht diese alle zu vereinfachen in einer einzigen Abfrage gefunden. Wie wird das gemacht?

Antwort

3

Sie suchen, was eine Kreuztabelle Abfrage oder Pivot-Tabelle genannt.

Dies sollte es für Sie tun ..

SELECT  YEAR(JoinDate) YEAR, 
      SUM(CASE [Level] WHEN 1 THEN 
        1 ELSE 0 END) Gold, 
      SUM(CASE [Level] WHEN 2 THEN 
        1 ELSE 0 END) Silver, 
      SUM(CASE [Level] WHEN 3 THEN 
        1 ELSE 0 END) Bronze, 
     COUNT([Level]) Total 
FROM  members 
GROUP BY YEAR(JoinDate) 
ORDER BY YEAR(JoinDate) 

Mehr auf Kreuztabelle abfragt here.

1

einfachste Weg wäre:

SELECT YEAR(JoinDate) AS YEAR, 
    SUM(case when Level = 1 then 1 else 0 end) AS GoldCount, 
    SUM(case when Level = 2 then 1 else 0 end) AS SilverCount, 
    SUM(case when Level = 3 then 1 else 0 end) AS BronzeCount 
FROM Members 
GROUP BY YEAR(JoinDate) ORDER BY YEAR(JoinDate) 
1

Und die Gesamtzahl auf Julias Antwort hinzufügen möchten, fügen Sie einfach COUNT (*)

SELECT YEAR(JoinDate) AS YEAR,  
    SUM(case when Level = 1 then 1 else 0 end) AS GoldCount,  
    SUM(case when Level = 2 then 1 else 0 end) AS SilverCount,  
    SUM(case when Level = 3 then 1 else 0 end) AS BronzeCount, 
    Count(*) TotalCount 
FROM Members 
GROUP BY YEAR(JoinDate) 
ORDER BY YEAR(JoinDate)