2009-08-08 69 views
1

我有一个MEMBERS表具有以下相关栏目:如何从多个SQL选择器加入汇总结果?

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

我想创建一个查询返回一个成员总结,列出谁参加了由年份和会员级别的总数。基本上,我的结果集的列会是这样的:

| YEAR | GOLD | SILVER | BRONZE | TOTAL | 

我能,银,铜奖成员分别采用以下3个查询得到每年不同的计数黄金:

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) 

我也可以用类似的查询获得总计:

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

我的问题是我还没有找到一种方法来简化所有这些到一个查询。这是如何完成的?

回答

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)