如何解决SQL Server:COUNT*为零值
| 我有一张桌子@MemberAttributeMemberID 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
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。