SQL Server:COUNT(*)的零值

时间:2011-06-13 23:06:10

标签: sql sql-server

我有一张桌子@MemberAttribute

MemberID AttributeID AttributeValue
1            1         False 
1            2         True 
2            1         False
2            2         True 
3            1         False
3            2         False

我想按属性ID进行分组,并获取值为True的属性的计数。但是当某个属性的attributetype为false时,我希望它显示为0.现在,所有false vallues的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/>
结果集中也是

2 个答案:

答案 0 :(得分:4)

试试这个 - 请注意...THEN 1 ELSE ...中的1是任意非NULL值 - 它可以是'fred'或12345 - 它不是NULL是重要部分。

SELECT MA.AttributeID, GA.Name,
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

......更直观一些(感谢肯) - 请注意,这里1和0很重要......

SELECT MA.AttributeID, GA.Name,
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

答案 1 :(得分:3)

经过一些扭动,我想出了这个没有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

这利用了以下事实:如果特定AttributeID没有“真实”值,则MA.AttributeID生成的LEFT OUTER JOIN将为NULL。传入NULL的{​​{1}}值将导致COUNT()为零。 AttributeCount还确保在LEFT OUTER JOIN行的结果集中存在一行,且计数为零。

此查询的假设是所有组属性都在AttributeID表变量中表示。如果不是,则将存在零计数的行,表示不存在的组属性。如果这是不合需要的,可以添加@MemberAttribute子句来过滤它们,使这个查询复杂化。如果是这样的话,威尔的解决方案会更加实用。

执行计划与Will的第一个解决方案相比较,包含少一个(Compute Scalar)步骤。它确实使用了WHERELEFT OUTER JOIN,但这两个方法对于这个简单的例子几乎完全相同。如果将表变量转换为相当大的表,那么看两个解如何扩展将会很有趣。

他的解决方案的实际计划是否涉及INNER JOIN

enter image description here

我的实际计划:

enter image description here