我有一张桌子@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/>
结果集中也是。
答案 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)步骤。它确实使用了WHERE
与LEFT OUTER JOIN
,但这两个方法对于这个简单的例子几乎完全相同。如果将表变量转换为相当大的表,那么看两个解如何扩展将会很有趣。
他的解决方案的实际计划是否涉及INNER JOIN
:
我的实际计划: