一列的计数记录WHERE值不同

时间:2019-10-02 15:53:33

标签: sql sql-server tsql counting

我对SQL服务器和堆栈溢出还很陌生,所以如果我的问题用词错误或天真,请原谅我。 我尝试搜索,但找不到确切的内容。

我有一张表,其中有一个列唯一标识符 (varchar 50),另一个是INT column1 ,其值是1、2、3或4。我正在尝试创建一个SELECT结果集,该结果集COUNT记录 column1 中所有值小于4的记录,而另一个COUNT返回 column1 等于4的记录数。是否可以在一个查询中创建此结果集?

理想情况下,我希望结果集如下所示:

Total Records       Records w/ *column1* < 4             Records w/ *column1* = 4
===========           ==================                     ================
   1000                      850                                    150

完成一些搜索后,我尝试了以下操作:

SELECT COUNT(unique_id) 'Total'
, COUNT(CASE
WHEN column1 = 4 THEN '1'
ELSE '0' 
END) AS 'Records w/ 4'
, COUNT(CASE
WHEN column1 < 4 THEN '1'
ELSE '0'
END) AS 'Records < 4'
FROM mytable
; 

哪个返回结果集,其中“ Record w / 4”和“ Total”都等于相同的数字。

3 个答案:

答案 0 :(得分:1)

试试这个-

SELECT COUNT(*) 'Total'
, SUM(CASE WHEN column1 = 4 THEN 1 ELSE 0 END) AS 'Records w/ 4'
, SUM(CASE WHEN column1 < 4 THEN 1 ELSE 0 END) AS 'Records < 4'
FROM mytable

答案 1 :(得分:0)

您只是在寻找简单的条件聚合,

SELECT COUNT(1) Total,
       SUM(CASE WHEN Value < 4 THEN 1 ELSE 0 END) LessThan4,
       SUM(CASE WHEN Value = 4 THEN 1 ELSE 0 END) EqualTo4,
       SUM(CASE WHEN Value > 4 THEN 1 ELSE 0 END) MoreThan4
FROM
(
  VALUES
  (1, 1),
  (2, 2),
  (3, 3),
  (4, 4),
  (5, 5)
) T(Id, Value);

答案 2 :(得分:0)

我更喜欢为此目的使用sum(),但是您也可以使用count()。您的方法无效,因为count()会计算非NULL值的数量-并且thenelse都返回非NULL值。

因此,您也可以这样做:

SELECT COUNT(unique_id) as Total,
       COUNT(CASE WHEN column1 = 4 THEN 1 END) AS Records_eq_4,
       COUNT(CASE WHEN column1 < 4 THEN 1 END) AS Records_lt_4,
       COUNT(CASE WHEN column1 > 4 THEN 1 END) AS Records_gt_4
FROM mytable; 

请注意,我重命名了列,因此不需要转义它们。仅对字符串和日期常量使用单引号。