代码之家  ›  专栏  ›  技术社区  ›  dave

如何在一个SQL查询中组合多个计数

sql
  •  0
  • dave  · 技术社区  · 5 年前

    我希望能够编写一个SQL查询,从我的数据库中提取有关俱乐部和球队的数据。假设我有一个简单的模式,由以下伪代码表示:

    TABLE CLUB
      ID int
      NAME varchar
      ...
    
    TABLE TEAM
      ID int
      NAME varchar
      CLUB_ID int -- foreign key into CLUB
      PAID_UP boolean
      ...
    

    我可以通过以下方法获得每个俱乐部的球队数量:

    SELECT CLUB.id, CLUB.name, COUNT(TEAM.id) AS "#TEAMS"
    FROM CLUB
    INNER JOIN TEAM
    ON CLUB.ID = TEAM.CLUB_ID
    GROUP BY CLUB.ID
    

    我可以通过以下方式修改该查询以获得每个俱乐部的付费球队数量:

    SELECT CLUB.id, CLUB.name, COUNT(TEAM.id) AS "#PAID UP TEAMS"
    FROM CLUB
    INNER JOIN TEAM
    ON CLUB.ID = TEAM.CLUB_ID
    WHERE TEAM.PAID_UP = true
    GROUP BY CLUB.ID
    

    CLUB    #TEAMS  #PAIDUP  %PAIDUP
    Eagles       4        3      75%
    Cobras      10        6      60%
    ...
    
    1 回复  |  直到 5 年前
        1
  •  2
  •   Abra BlueJK    5 年前

    未经测试。

    SELECT CLUB.id
          ,CLUB.name
          ,COUNT(TEAM.id) AS "#TEAMS"
          ,SUM( case TEAM.PAID_UP
                    when true then 1
                    else 0
                  end case) AS "#PAID UP TEAMS"
          ,"#TEAMS" / "#PAID UP TEAMS" * 100 AS "%PAIDUP"
    FROM CLUB
    INNER JOIN TEAM
    ON CLUB.ID = TEAM.CLUB_ID
    GROUP BY CLUB.ID
    

    如果错了,我就删掉。

    编辑

    根据对此答案的注释,您可以简单地重复列表达式。

    SELECT CLUB.id
          ,CLUB.name
          ,COUNT(TEAM.id) AS "#TEAMS"
          ,SUM( case TEAM.PAID_UP
                    when true then 1
                    else 0
                  end case) AS "#PAID UP TEAMS"
          ,COUNT(TEAM.id) / SUM( case TEAM.PAID_UP
                    when true then 1
                    else 0
                  end case) * 100 AS "%PAIDUP"
    FROM CLUB
    INNER JOIN TEAM
    ON CLUB.ID = TEAM.CLUB_ID
    GROUP BY CLUB.ID
    
        2
  •  1
  •   dave    5 年前

    COUNT this question 我们有计算。后者 SELECT 是前者的。

    SELECT "ID", "NAME", "#TEAMS", "#PAID_UP",
           100 * "#PAID_UP" / "#TEAMS" AS "%PAID_UP" FROM (
        SELECT CLUB.id AS "ID",
            CLUB.name AS "NAME",
            COUNT(TEAM.id) AS "#TEAMS"
            SUM(CASE TEAM.PAID_UP
                    WHEN true THEN 1
                    ELSE 0
                END) AS "#PAID_UP"
        FROM CLUB
        INNER JOIN TEAM
        ON CLUB.ID = TEAM.CLUB_ID
        GROUP BY CLUB.ID
    ) AS "INNER"