【问题标题】:How do I COUNT rows of a GROUP BY query where a condition matches?如何计算条件匹配的 GROUP BY 查询的行?
【发布时间】:2020-05-03 19:31:42
【问题描述】:

这是我的个人表:

neighborhood  birthyear
a             1958
a             1959
b             1970
c             1980

我想获取每个社区中某个年龄段的人的COUNT。例如,如果我想让所有人都未满 18 岁,我会得到:

neighborhood  count
a             0
b             0
c             0

如果我想让每个人都超过 50 岁,我会得到

neighborhood  count
a             2
b             0
c             0

我试过了

SELECT neighborhood, COUNT(*)
    FROM persons
    WHERE YEAR(NOW()) - persons.birthyear < 18
    GROUP BY neighborhood;

但这给了我 0 行,而我想要 3 行具有不同邻域的行,每个行数为 0。我将如何做到这一点?

【问题讨论】:

    标签: mysql sql group-by count


    【解决方案1】:

    您可以使用条件聚合:

    SELECT neighborhood, SUM(YEAR(NOW()) - p.birthyear) as under_18,
           SUM(YEAR(NOW()) - p.birthyear BETWEEN 34 AND 42) as age_34_42
    FROM persons p
    GROUP BY neighborhood;
    

    【讨论】:

      【解决方案2】:

      我认为如果计数为 0,则该行不会出现。 您的代码对我来说似乎是正确的,如果您在 50 岁的示例中尝试它,它应该会给您一行预期的行 (neighborhood:a,count:2)

      【讨论】:

        【解决方案3】:

        我建议使用子查询:

        SELECT 
            count(*) [group-by-count-greater-than-ten] 
        FROM 
        (
           SELECT 
              columnFoo, 
              count(*) cnt
           FROM barTable
           WHERE columnBaz = "barbaz"
           GROUP BY columnFoo
        ) 
        AS subQuery
        WHERE cnt > 10
        

        在上面,subquery 返回结果集被 main query 用作任何其他表。

        main query 不再将列cnt 视为计算域,并且不必引用count() 函数。

        但是,在运行where 子句或必须查看别名cnt 列的having 子句的subquery 内,必须将count() 函数引用为引用cnt subquery 会抛出错误。

        在您的情况下,使用 subquery 看起来像这样。

        SELECT 
            neighborhood, 
            age, 
            count(*) as cnt
        FROM
        (
             SELECT 
                 *, 
                 (YEAR(NOW()) - birthyear) as age 
             FROM PERSONS
        ) as WithAge
        WHERE age < 18
        GROUP BY neighborhood, age
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2018-10-26
          • 1970-01-01
          • 1970-01-01
          • 2021-02-04
          • 2011-09-10
          • 1970-01-01
          • 2013-11-17
          • 1970-01-01
          相关资源
          最近更新 更多