为了账号安全,请及时绑定邮箱和手机立即绑定

相当于COUNTIF聚合函数的SQL Server

相当于COUNTIF聚合函数的SQL Server

肥皂起泡泡 2019-11-12 10:45:01
我正在建立一个带有GROUP BY子句的查询,该子句需要能够仅基于特定条件来对记录进行计数(例如,仅对某个列值等于1的记录进行计数)。SELECT  UID,         COUNT(UID) AS TotalRecords,         SUM(ContractDollars) AS ContractDollars,        (COUNTIF(MyColumn, 1) / COUNT(UID) * 100) -- Get the average of all records that are 1FROM    dbo.AD_CurrentViewGROUP BY UIDHAVING  SUM(ContractDollars) >= 500000该COUNTIF()行显然由于没有调用本机SQL函数COUNTIF而失败,但是这里的想法是确定MyColumn的所有值为'1'的行的百分比。关于如何在MS SQL 2005环境中正确实现这一点的任何想法?
查看完整描述

3 回答

?
开心每一天1111

TA贡献1836条经验 获得超12个赞

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


SELECT SUM(CASE WHEN myColumn=1 THEN 1 ELSE 0 END)

FROM AD_CurrentView

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


SELECT SUM(CASE WHEN ISNULL(myColumn,0)=1 THEN 1 ELSE 0 END)

FROM AD_CurrentView


查看完整回答
反对 回复 2019-11-12
?
蝴蝶不菲

TA贡献1810条经验 获得超4个赞

我通常会按照Josh的建议去做,但是集思广益并测试了我觉得很喜欢分享的略微曲折的选择。


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


SELECT COUNT(NULLIF(0, myColumn))

FROM AD_CurrentView

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


优点:将您的意图表达为COUNT行,而不是SUM()表示法。缺点:不清楚其工作方式(“魔术”通常很糟糕)。


查看完整回答
反对 回复 2019-11-12
?
慕容708150

TA贡献1831条经验 获得超4个赞

SELECT COUNT(CASE WHEN myColumn=1 THEN AD_CurrentView.PrimaryKeyColumn ELSE NULL END)

FROM AD_CurrentView

对于我来说效果很好(在SQL Server 2012中),而无需将“计数”更改为“总和”,并且相同的逻辑可移植到其他“条件聚合”中。例如,根据条件求和:


SELECT SUM(CASE WHEN myColumn=1 THEN AD_CurrentView.NumberColumn ELSE 0 END)

FROM AD_CurrentView


查看完整回答
反对 回复 2019-11-12
  • 3 回答
  • 0 关注
  • 1233 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信