Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/74.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 从值不同的一列中计数记录_Sql_Sql Server_Tsql_Counting - Fatal编程技术网

Sql 从值不同的一列中计数记录

Sql 从值不同的一列中计数记录,sql,sql-server,tsql,counting,Sql,Sql Server,Tsql,Counting,我对SQL server和堆栈溢出还比较陌生,所以如果我的问题用词不当或幼稚,请原谅我。 我试着搜索,但找不到我要找的东西 我有一个表,其中有一个colummn唯一标识符varchar 50,另一个column1为INT,其值为1、2、3或4。我正在尝试创建一个SELECT resultset,该集合统计column1中值小于4的所有记录,另一个计数返回column1等于4的记录数。是否可以在一个查询中创建此结果集 理想情况下,我希望我的结果集如下所示: Total Records

我对SQL server和堆栈溢出还比较陌生,所以如果我的问题用词不当或幼稚,请原谅我。 我试着搜索,但找不到我要找的东西

我有一个表,其中有一个colummn唯一标识符varchar 50,另一个column1为INT,其值为1、2、3或4。我正在尝试创建一个SELECT resultset,该集合统计column1中值小于4的所有记录,另一个计数返回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
; 
在完成一些搜索后,我尝试了以下方法:

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”都等于相同的数字。

试试这个-

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

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

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);
我更喜欢使用sum,但也可以使用count。您的方法不起作用,因为count计算非NULL值的数量,而then和else都返回非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; 

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

是否尝试使用SUM更改第二个计数?也不要使用数字作为字符“1”,而是使用1I也将用SUM替换第三个计数。为什么使用SUM?我不确定他想要一栏的总和。也许我错过了什么。150条记录=4的总和为600,而不是150。@TinyHaitian,因为COUNT也将计算0。对于SUM,添加0不会增加您的数字。你们可以自己试试,看看计数是否有效。啊,我重读了他的问题。现在明白了。仍然需要调整。我会在我这边重新评估。