SQL Server:COUNT*为零值

问题描述

| 我有一张桌子@MemberAttribute
MemberID AttributeID AttributeValue
1            1         False 
1            2         True 
2            1         False
2            2         True 
3            1         False
3            2         False
我想按attributeID分组并获取值为True的属性计数。但是,当某个特定属性的attributetype为false时,我希望它显示0。现在,不显示带有所有错误值的attributeID。 这是SQL查询
SELECT MA.AttributeID,GA.Name,--COUNT(isNull(MA.AttributeID,0)) as AttributCount,CASE WHEN COUNT(MA.AttributeID) > 0 THEN COUNT(MA.AttributeID) Else 0 END AS \'AttributCount\'
--CASE WHEN COUNT(MA.AttributeID) < 0 THEN 0 Else COUNT(MA.AttributeID) END AS \'TOTAL Attributes\'
from GroupAttribute GA
inner join   @MemberAttribute MA on GA.GroupAttributeID = MA.AttributeID
WHERE MA.AttributeValue = \'True\'
GROUP BY MA.AttributeID,GA.Name
FOR AttributeID = 1所有值均为= False ...所以结果是这样的
AttributeID      Name      AttributeCount <br/>
2                Attr2        2 <br/>
我想要
1                 Attr1      0  <br/>
在结果集中也是如此。     

解决方法

        经过一番蠕动,我想出了一个没有
CASE
表情的美女:
SELECT GA.GroupAttributeID AS AttributeID,GA.Name,COUNT(MA.AttributeID) AS AttributeCount
FROM GroupAttribute AS GA 
LEFT OUTER JOIN @MemberAttribute AS MA 
  ON GA.GroupAttributeID = MA.AttributeID AND MA.AttributeValue = \'True\'
GROUP BY GA.GroupAttributeID,GA.Name
这利用了这样一个事实,即如果对于特定的ѭ6ue没有\'True \'值,则由
LEFT OUTER JOIN
产生的
MA.AttributeID
将为
NULL
。传递给
COUNT()
NULL
值将导致
AttributeCount
为零。
LEFT OUTER JOIN
还确保
AttributeID
行的计数为零的行将出现在结果集中。 该查询的假设是所有组属性都在“ 15”表变量中表示。否则,将存在计数为零的行,这些行表示不存在的组属性。如果不希望这样做,可以添加一个
WHERE
子句以将其过滤掉,从而使查询复杂化。如果是这样的话,威尔的解决方案将更加实用。 执行计划与Will的第一个解决方案比较好,该解决方案减少了一个步骤(计算标量)。它确实使用了
LEFT OUTER JOIN
INNER JOIN
,但是,对于这个简单的示例,这两种方法实际上是相同的。有趣的是,如果将表变量转换为相当大的表,这两个解决方案将如何扩展。 威尔针对涉及“ѭ11”的解决方案的实际计划: 我的实际计划:     ,        试试这个-注意note20ѭ中的1是一个任意的非NULL值-可以是\'fred \'或12345-它不是NULL是重要的部分。
SELECT MA.AttributeID,COUNT(CASE WHEN MA.AttributeValue = \'True\' THEN 1 ELSE NULL END) AS \'AttributeCount\'
from GroupAttribute GA
inner join   @MemberAttribute MA on GA.GroupAttributeID = MA.AttributeID
GROUP BY MA.AttributeID,GA.Name
...更加直观(感谢Ken)-请注意,这里的1和0很重要...
SELECT MA.AttributeID,SUM(CASE WHEN MA.AttributeValue = \'True\' THEN 1 ELSE 0 END) AS \'AttributeCount\'
from GroupAttribute GA
inner join   @MemberAttribute MA on GA.GroupAttributeID = MA.AttributeID
GROUP BY MA.AttributeID,GA.Name
    

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...