如何有条件地指望子集合

时间:2017-02-02 19:14:37

标签: sql tsql sql-server-2016

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才算数。

如何在表达式中实现?子查询在我的情况下没有帮助(我知道如何使用子查询)。

4 个答案:

答案 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;