2009-08-08 11 views
1

は、私は以下の関連列を持つMEMBERSテーブルを持っている:いくつかのSQL SELECTSの集計結果をどのようにJOINするのですか?

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

は私が年によって、会員レベルによって接合された合計数を示していますメンバーシップの要約を返すために、単一のクエリを作成したいです。基本的に、私の結果セット内の列は、このようなものになるだろう:私は

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) 

:私はゴールド、シルバー、ブロンズメンバーのため毎年異なるカウントを得ることができる

| YEAR | GOLD | SILVER | BRONZE | TOTAL | 

、それぞれ以下の3つのクエリを使用して

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

私の問題は、これらのすべてを1つのクエリに単純化する方法が見つかりませんでした。これはどうですか?

答えて

3

あなたは、クロスタブクエリまたはピボットテーブルと呼ばれるものを探しています。クロスタブの

これはあなたのためにそれを行う必要があります。..

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) 

もっとhereを照会します。

1

最も簡単な方法は、次のようになります。

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

そして、ちょうど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) 
を追加し、ジュリエットの答えに合計を追加します
関連する問題