首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >相当于COUNTIF聚合函数的Sql Server

相当于COUNTIF聚合函数的Sql Server
EN

Stack Overflow用户
提问于 2009-02-24 17:17:19
回答 9查看 414.4K关注 0票数 179

我正在构建一个带有GROUP BY子句的查询,该子句需要仅基于特定条件对记录进行计数的能力(例如,仅对特定列值等于1的记录进行计数)。

代码语言:javascript
复制
SELECT  UID, 
        COUNT(UID) AS TotalRecords, 
        SUM(ContractDollars) AS ContractDollars,
        (COUNTIF(MyColumn, 1) / COUNT(UID) * 100) -- Get the average of all records that are 1
FROM    dbo.AD_CurrentView
GROUP BY UID
HAVING  SUM(ContractDollars) >= 500000

SQL行显然失败了,因为没有名为COUNTIF的原生COUNTIF()函数,但是这里的想法是确定MyColumn的值为'1‘的所有行的百分比。

对于如何在MS SQL 2005环境中正确实现这一点,您有什么想法吗?

EN

回答 9

Stack Overflow用户

回答已采纳

发布于 2009-02-24 17:20:23

您可以使用SUM (而不是COUNT!)与CASE语句结合使用,如下所示:

代码语言:javascript
复制
SELECT SUM(CASE WHEN myColumn=1 THEN 1 ELSE 0 END)
FROM AD_CurrentView

注意:在我自己的测试中,NULL不是问题,尽管这可能与环境有关。您可以处理空值,例如:

代码语言:javascript
复制
SELECT SUM(CASE WHEN ISNULL(myColumn,0)=1 THEN 1 ELSE 0 END)
FROM AD_CurrentView
票数 378
EN

Stack Overflow用户

发布于 2009-02-24 17:38:29

我通常会按照Josh的建议去做,但是我集思广益,并测试了一个我想分享的稍微有点做作的替代方案。

您可以利用COUNT(ColumnName)不计算NULL这一事实,并使用如下内容:

代码语言:javascript
复制
SELECT COUNT(NULLIF(0, myColumn))
FROM AD_CurrentView

NULLIF -如果传入的两个值相同,则返回NULL。

优点:表示您希望计算行数,而不是使用SUM()表示法。缺点:不清楚它是如何工作的(“魔法”通常是不好的)。

票数 57
EN

Stack Overflow用户

发布于 2010-03-04 07:25:19

我会使用这种语法。它与Josh和Chris的建议相同,但优点是它符合ANSI,并且不依赖于特定的数据库供应商。

代码语言:javascript
复制
select count(case when myColumn = 1 then 1 else null end)
from   AD_CurrentView
票数 25
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/582637

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档