对值不同的列中的记录进行计数

a7qyws3x  于 2022-10-03  发布在  其他
关注(0)|答案(3)|浏览(134)

我对SQL-SERVER和堆栈溢出还很陌生,所以如果我的问题措辞错误或者太幼稚,请原谅。

我试着搜索,但找不到我要找的东西。

我有一个表,其中唯一标识符列(varchar 50),另一个Column1INT的值为1、2、3或4。我正在尝试创建一个SELECT结果集,其中e1d3d1包含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’都等于相同的数字。

wn9m85ua

wn9m85ua1#

试试这个-

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
a6b3iqyw

a6b3iqyw2#

您只是在寻找一个简单的条件聚合,如下所示

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);
axr492tv

axr492tv3#

为此,我更喜欢使用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;

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

相关问题