Stack Overflow上有几个问题涉及条件计数的直接情况,例如:
Name Amount
A 10
B 0
您想知道有多少名称具有非零金额。但我的用例有点不同。我有一张这样的桌子:
Category Name Amount
Top A 10
Top A -5
Top B 10
Top B -10
现在我想要一个看起来像这样的结果:
Category NameCount
Top 1
因为A的金额总和是5,但是对于B是0,所以只有A才算数。
如何在表达式中实现?子查询在我的情况下没有帮助(我知道如何使用子查询)。
答案 0 :(得分:3)
您可以通过使用子查询或CTE
非常轻松地执行此操作:
;With Cte As
(
Select Category, Name, Sum(Amount) As TotalAmount
From YourTable
Group by Category, Name
Having Sum(Amount) <> 0
)
Select Category, Count(Distinct Name) AS NameCount
From Cte
Group By Category
答案 1 :(得分:2)
SELECT Category,Name,SUM( Amount ) AS SumVal
INTO #Categories
FROM Yourtable
GROUP BY Category, Name;
SELECT Category, SUM( CASE WHEN SumVal <> 0 THEN 1 ELSE 0 END ) AS NameCount
FROM #Categories
GROUP BY Category;
答案 2 :(得分:1)
根据我对此处问题的理解,您希望在不同的粒度下在同一数据集上聚合两次(同时在中间应用一些过滤器)。 如果不使用某种形式的子查询(temp table,cte等),就不可能执行这种操作,因为group by by条件只能在单个查询中以单个粒度应用。
答案 3 :(得分:0)
只需在子查询中聚合以查找非零总计的类别和名称,然后在每个类别中查找不同名称的计数:
select
category,
count(name) namecount
from (
select
category,
name
from your_table t
group by category, name
having sum(amount) <> 0
) t group by category;