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

使用WHERE子句在聚合函数vs中指定列值

sql
  •  1
  • shamalaia  · 技术社区  · 6 年前

    我有数据库 people 看起来是这样的:

    我想数一数 state='CA' .

    我的第一次尝试是:

    SELECT COUNT(state='CA')
    FROM people 
    ;
    

    返回值为1000的一行。所以我想数据库里有1000人来自加州。

    结果是不正确的。我知道他们是127,我可以通过查询来验证

    SELECT COUNT(*)
    FROM people 
    WHERE state='CA'
    ;
    

    返回值为127的一行。

    我理解第二个查询是如何工作的。但是,我不明白第一个有什么问题。它还回来什么?

    6 回复  |  直到 6 年前
        1
  •  2
  •   ScaisEdge    6 年前

    计数不是一个总和。。您的第一个查询不正确,因为不返回正确的行数。。但不为空的行的总数是真是假

    如果需要筛选计数,则必须使用where条件(作为第二个查询),否则必须在sum()函数中使用if或select大小写,例如:

     Select sum(case 
              when state='CA' then 1 else 0
               end) as my_result from People;
    

    或者如果你想数数。。使用空而不是0分钟计数

     Select count(case 
              when state='CA' then 1 else null
               end) as my_result from People;
    
        2
  •  4
  •   Marcin Romaszewicz    6 年前

    如果要查看发生了什么,请运行查询:

    select state='CA' from people;
    

    您将看到people中的每一行都会得到一个结果,值为0或1(或True/False)。您选择的是每一行是否state='CA',这些结果的数量将与行的数量一样多。

    不能在语句中约束COUNT语句,必须通过WHERE子句来实现,如第二个示例所示。

        3
  •  1
  •   IShubh    6 年前

    试试这个-:

    Select count(case when state='CA' then 1 else null end) as xyz from People;
    
        4
  •  1
  •   Zaynul Abadin Tuhin    6 年前

    如果您使用 case when 在侧数中, 如下查询将返回CA的计数

    SELECT sum( case when state='CA' then 1 else 0 end)
    FROM people
    
        5
  •  1
  •   akshay    6 年前

    在第一个查询中,它将值“CA”分配给所有1000行的列状态,而不是筛选值。那就是 SELECT 做。 选择 不筛选返回的行数,而是修改数据。

    鉴于 WHERE 子句首先筛选行,然后 选择 子句运行 COUNT 功能。

    有一个运行查询的序列。它开始于 FROM 然后 哪里 , GROUP BY , ORDER BY 最后 选择 会跑的。

        6
  •  1
  •   TomC    6 年前

    回答实际的问题-为什么你得到1000?我猜您的数据库中有1000行,或者至少有1000行state不为空。Count将返回()中的内容不为空的行数,正如您的一条评论所说,()中的部分将返回true或false,两者都不为空,因此将对它们全部进行计数。你的第二个例子当然是正确的方法。