【问题标题】:How do I JOIN aggregations results from several SQL SELECTS?如何加入来自多个 SQL SELECTS 的聚合结果?
【发布时间】:2010-11-17 22:43:33
【问题描述】:

我有一个MEMBERS 表,其中包含以下相关列:

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

我想创建一个查询来返回一个会员摘要,其中列出了按年份和会员级别加入的总数。基本上,我的结果集中的列是这样的:

| YEAR | GOLD | SILVER | BRONZE | TOTAL |

我可以使用以下 3 个查询分别获得 Gold、Silver 和 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)  

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

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

我的问题是我还没有找到将所有这些简化为单个查询的方法。这是怎么做到的?

【问题讨论】:

    标签: sql sql-server join group-by


    【解决方案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)
    

    【讨论】:

      【解决方案2】:

      您正在寻找所谓的交叉表查询或数据透视表。

      这应该会为你做的..

      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

      【讨论】:

        【解决方案3】:

        最简单的方法是:

        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)
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2019-12-03
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2018-07-09
          • 2018-02-26
          • 1970-01-01
          相关资源
          最近更新 更多