Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/25.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 是否可以在Count()中指定条件?_Sql_Sql Server_Tsql - Fatal编程技术网

Sql 是否可以在Count()中指定条件?

Sql 是否可以在Count()中指定条件?,sql,sql-server,tsql,Sql,Sql Server,Tsql,是否可以在Count()中指定条件?我只想计算那些在Position列中有“Manager”的行 我想在count语句中执行,而不是使用WHERE;我之所以问这个问题,是因为我需要在同一个选择(类似count(Position=Manager)、count(Position=Other))中同时计算经理和其他人的人数因此WHERE在本例中对我没有用处。我认为您可以使用一个简单的WHERE子句仅选择count some记录。您的意思是: SELECT COUNT(*) FROM bla WHERE

是否可以在
Count()
中指定条件?我只想计算那些在Position列中有“Manager”的行


我想在count语句中执行,而不是使用
WHERE
;我之所以问这个问题,是因为我需要在同一个
选择
(类似
count(Position=Manager)、count(Position=Other))中同时计算经理和其他人的人数
因此
WHERE
在本例中对我没有用处。

我认为您可以使用一个简单的WHERE子句仅选择count some记录。

您的意思是:

SELECT COUNT(*) FROM bla WHERE Position = 'Manager'
SELECT Count(*) FROM YourTable WHERE Position = 'Manager'

如果是这样的话,那就行了

假设您不想限制返回的行,因为您也在聚合其他值,您可以这样做:

select count(case when Position = 'Manager' then 1 else null end) as ManagerCount
from ...
select count(case when Position = 'Manager' then 1 else null end) as ManagerCount,
    count(case when Position = 'Supervisor' then 1 else null end) as SupervisorCount,
    count(case when Position = 'Team Lead' then 1 else null end) as TeamLeadCount,
from ...
假设在同一列中,您有经理、主管和团队领导的价值观,您可以得到如下每种价值观的计数:

select count(case when Position = 'Manager' then 1 else null end) as ManagerCount
from ...
select count(case when Position = 'Manager' then 1 else null end) as ManagerCount,
    count(case when Position = 'Supervisor' then 1 else null end) as SupervisorCount,
    count(case when Position = 'Team Lead' then 1 else null end) as TeamLeadCount,
from ...

取决于您的意思,但对含义的另一种解释是,您希望计算具有特定值的行,但不希望将
SELECT
仅限于这些行

您可以在中使用带有子句的
SUM()
,而不是使用
COUNT()
: e、 g


如果不能仅使用
where
子句限制查询本身,则可以使用
count
聚合只计算非空值这一事实:

select count(case Position when 'Manager' then 1 else null end)
from ...
您还可以以类似的方式使用
总和
聚合:

select sum(case Position when 'Manager' then 1 else 0 end)
from ...

如果使用的是SQL 2005或更高版本,也可以使用Pivot关键字

来自

测试数据集

DECLARE @Users TABLE (Position VARCHAR(10))
INSERT INTO @Users (Position) VALUES('Manager')
INSERT INTO @Users (Position) VALUES('Manager')
INSERT INTO @Users (Position) VALUES('Manager')
INSERT INTO @Users (Position) VALUES('CEO')
INSERT INTO @Users (Position) VALUES('Employee')
INSERT INTO @Users (Position) VALUES('Employee')
INSERT INTO @Users (Position) VALUES('Employee')
INSERT INTO @Users (Position) VALUES('Employee')
INSERT INTO @Users (Position) VALUES('Employee')
INSERT INTO @Users (Position) VALUES('Employee')

我知道这真的很老了,但我喜欢这种情况下的
NULLIF
技巧,到目前为止我没有发现任何缺点。请看我的复制和粘贴示例,虽然它不太实用,但演示了如何使用它

NULLIF
可能会对性能产生一些负面影响,但我想它应该比子查询更快

DECLARE @tbl TABLE ( id [int] NOT NULL, field [varchar](50) NOT NULL)

INSERT INTO @tbl (id, field)
SELECT 1, 'Manager'
UNION SELECT 2, 'Manager'
UNION SELECT 3, 'Customer'
UNION SELECT 4, 'Boss'
UNION SELECT 5, 'Intern'
UNION SELECT 6, 'Customer'
UNION SELECT 7, 'Customer'
UNION SELECT 8, 'Wife'
UNION SELECT 9, 'Son'

SELECT * FROM @tbl

SELECT 
    COUNT(1) AS [total]
    ,COUNT(1) - COUNT(NULLIF([field], 'Manager')) AS [Managers]
    ,COUNT(NULLIF([field], 'Manager')) AS [NotManagers]
    ,(COUNT(1) - COUNT(NULLIF([field], 'Wife'))) + (COUNT(1) - COUNT(NULLIF([field], 'Son'))) AS [Family]
FROM @tbl

欢迎评论:-)

@Guffa的回答非常好,只需指出IF语句可能更干净

select count(IF(Position = 'Manager', 1, NULL)) as ManagerCount
from ...
注意:使用PrestoDB SQL(来自Facebook),有一个快捷方式:

如果(x)计数→ 比基特

返回真实输入值的数目。这 函数相当于count(x然后1结束时的情况)


下面是我所做的工作,以获得一个数据集,其中包括每个装运集装箱内满足标准的总数和数量。这就让我来回答这个问题:“有多少集装箱的货物超过尺寸51的X%。”


如果使用Postgres或SQLite,则可以使用Filter子句提高可读性:

选择
将(1)个过滤器(其中位置='Manager')计数为ManagerCount,
计数(1)过滤器(其中位置='Other')作为OtherCount
从…起
BigQuery还具有
Countif
——请参见此处的跨不同SQL方言的支持,了解这些功能:

Boo对所有*用户来说,使用Count(表中的someColumnYourTable),其中Position='Manager'@Mark:在所有现代数据库上,这没有任何区别。@Mark&Philippe:事实上,它可以产生很大的区别。如果该字段为空且未编入索引,则查询需要触及表中的每条记录,因此使用count(*)和count(field)可以得到不同的网络结果和性能。多年来,我一直在分析count(*)与count(x)的执行计划,到目前为止,我还没有发现任何一个计划显示出性能上的差异。这就是为什么我真的希望看到一个有差异的查询示例。@Matthew:我们不是说
SELECT*
,而是说
SELECT COUNT(*)
,这是一个完全不同的问题。为什么我会投反对票?在我回答之后(或者可能是同一时间),许多人回答了类似的问题,他们没有得到任何反对票(由于问题是“在计数中指定条件”而不是“按条件计算值”,因此您将获得否决票。).所以你回答了错误的问题对答案投否决票有点不公平,当答案写出来时,这是对问题的正确解决方案……他在这个答案后4分钟添加了额外的文本!@RedFilter甚至不必指定
else
部分,只需在
1
@Denis:co后面指定
结束
即可更正-我经常将
else
保留在中,因为它可以更好地记录case语句的结果,特别是对于novie SQL开发人员。为简洁起见,在这种情况下可以删除它。如果我的字段是整数,并且我想匹配null,该怎么办?这样不行选择count(case IntegerField当'null'时,然后选择1 else null end) from@Faizan
null
是特殊的。当IntegerField为null时使用
case,然后…
当处理布尔字段时,可以使用以下内容:
SUM(CONVERT(int,IsManager))
SQL Server为
case
语句暗示
否则为null
,因此
count()
示例可以短10个字符(如果你计算空间的话)编辑显示他不想用WHERE-clauseNo限制行,问题明确地说“我想在count语句中这样做,而不是使用WHERE”与SQLite完美结合-非常感谢
select
   Schedule,
   PackageNum,
   COUNT (UniqueID) as Total,
   SUM (
   case
      when
         Size > 51 
      then
         1 
      else
         0 
   end
) as NumOverSize 
from
   Inventory 
where
   customer like '%PEPSI%' 
group by
   Schedule, PackageNum