我正在构建一个带有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
SQL行显然失败了,因为没有名为COUNTIF
的原生COUNTIF()
函数,但是这里的想法是确定MyColumn的值为'1‘的所有行的百分比。
对于如何在MS SQL 2005环境中正确实现这一点,您有什么想法吗?
发布于 2009-02-24 17:20:23
您可以使用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
发布于 2009-02-24 17:38:29
我通常会按照Josh的建议去做,但是我集思广益,并测试了一个我想分享的稍微有点做作的替代方案。
您可以利用COUNT(ColumnName)不计算NULL这一事实,并使用如下内容:
SELECT COUNT(NULLIF(0, myColumn))
FROM AD_CurrentView
NULLIF -如果传入的两个值相同,则返回NULL。
优点:表示您希望计算行数,而不是使用SUM()表示法。缺点:不清楚它是如何工作的(“魔法”通常是不好的)。
发布于 2010-03-04 07:25:19
我会使用这种语法。它与Josh和Chris的建议相同,但优点是它符合ANSI,并且不依赖于特定的数据库供应商。
select count(case when myColumn = 1 then 1 else null end)
from AD_CurrentView
https://stackoverflow.com/questions/582637
复制相似问题