相当于COUNTIF聚合函数的SQL Server

我正在建立一个带有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 1

FROM    dbo.AD_CurrentView

GROUP BY UID

HAVING  SUM(ContractDollars) >= 500000

该COUNTIF()行显然由于没有调用本机SQL函数COUNTIF而失败,但是这里的想法是确定MyColumn的所有值为'1'的行的百分比。


关于如何在MS SQL 2005环境中正确实现这一点的任何想法?


肥皂起泡泡
浏览 1237回答 3
3回答

开心每一天1111

您可以将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

蝴蝶不菲

我通常会按照Josh的建议去做,但是集思广益并测试了我觉得很喜欢分享的略微曲折的选择。您可以利用COUNT(ColumnName)不计算NULL的事实,并使用如下所示的内容:SELECT COUNT(NULLIF(0, myColumn))FROM AD_CurrentViewNULLIF-如果两个传入的值相同,则返回NULL。优点:将您的意图表达为COUNT行,而不是SUM()表示法。缺点:不清楚其工作方式(“魔术”通常很糟糕)。

慕容708150

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
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

SQL Server