Sql 如果总数为0,则删除结果组

Sql 如果总数为0,则删除结果组,sql,sql-server,group-by,Sql,Sql Server,Group By,我正在使用下表创建一个堆叠条形图-它比这个要大一些: ID | Name | foodEaten | total 1 | Sam | Burger | 3 1 | Sam | Pizza | 1 1 | Sam | Kebab | 0 1 | Sam | Cheesecake| 3 1 | Sam | Sandwich | 5 2 | Jeff | Burger | 0 2 | Jeff | Pizza | 0 2 | Jeff |

我正在使用下表创建一个堆叠条形图-它比这个要大一些:

ID | Name | foodEaten | total
1  | Sam  | Burger    | 3
1  | Sam  | Pizza     | 1
1  | Sam  | Kebab     | 0
1  | Sam  | Cheesecake| 3
1  | Sam  | Sandwich  | 5
2  | Jeff | Burger    | 0
2  | Jeff | Pizza     | 0
2  | Jeff | Kebab     | 0
2  | Jeff | Cheesecake| 0
2  | Jeff | Sandwich  | 0
我需要找到一种方法来删除像Jeff这样的结果。他吃的东西的总数是0。我想不出最简单的方法来实现这一点。我尝试过按Id对整个结果进行分组,并创建一个总数,但这并没有发生

如果一个人总共吃了0种食物,那么他需要被排除在外。但如果他没有,而且他没有吃过任何烤肉串,如我上表所示,这需要包括在结果中

因此,需要的输出是:

ID | Name | foodEaten | total
1  | Sam  | Burger    | 3
1  | Sam  | Pizza     | 1
1  | Sam  | Kebab     | 0
1  | Sam  | Cheesecake| 3
1  | Sam  | Sandwich  | 5
你可以在下面试试-

select id,name
from tablename a
group by id,name
having sum(total)>0 

select * from tablename a 
where not exists (select 1 from tablename b where a.id=b.id group by id,name
having sum(total)=0)
选择id、name、foodEaten、sum(total)作为sum(total)大于0的id分组中的总计

这对您有用吗?

使用
DELETE
HAVING SUM(total)=0将删除其总数为0的结果组

DELETE FROM TableName
WHERE ID IN (SELECT Id FROM TableName GROUP BY ID HAVING SUM(total) = 0)
或者,如果要删除并仅选择总和为零的记录,则

SELECT * FROM TableName
WHERE ID NOT IN (SELECT Id FROM TableName GROUP BY ID HAVING SUM(total) = 0)

假设您想要的是显示的数据,而不是汇总,然后排除:

WITH CTE AS (
    SELECT ID,
           [Name],
           foodEaten,
           total,
           SUM(total) OVER (PARTITION BY [Name]) AS nameTotal
    FROM YourTable)
SELECT ID,
       [Name],
       foodEaten,
       total
FROM CTE
WHERE nameTotal > 0;
试试这个

;WITH CTE (ID , Name , foodEaten , total)
AS
(
SELECT 1  , 'Sam'  , 'Burger'    , 3 UNION ALL
SELECT 1  , 'Sam'  , 'Pizza'     , 1 UNION ALL
SELECT 1  , 'Sam'  , 'Kebab'     , 2 UNION ALL
SELECT 1  , 'Sam'  , 'Cheesecake', 3 UNION ALL
SELECT 1  , 'Sam'  , 'Sandwich'  , 5 UNION ALL
SELECT 2  , 'Jeff' , 'Burger'    , 0 UNION ALL
SELECT 2  , 'Jeff' , 'Pizza'     , 0 UNION ALL
SELECT 2  , 'Jeff' , 'Kebab'     , 0 UNION ALL
SELECT 2  , 'Jeff' , 'Cheesecake', 0 UNION ALL
SELECT 2  , 'Jeff' , 'Sandwich'  , 0
)
SELECT ID , Name ,SUM( total)  AS Grandtotal
FROM CTE
GROUP BY  ID , Name 
HAVING SUM( total) >0
结果

ID  Name    Grandtotal
----------------------
1   Sam         14

假设
total
从不为负值,那么最有效的方法可能是使用
exists

select t.*
from t
where exists (select 1
              from t t2
              where t2.name = t.name and
                    t2.total > 0
             );

特别是,这可以利用
(name,total)

上的索引。问题是,我需要继续保留上面的格式(顺便感谢编辑),因此它仍然需要为Sam保留每一行。@samsmith,我添加了另一个解决方案,您可以尝试,我怀疑OP是否想
删除他们的数据。@Larnu我将标题读为“如果总数为0,则删除结果组”这很接近,但如果Sam吃了0个汉堡,则不包括在内,我需要它来删除contain@samsmith不,这不是我的错,我在“Where”中使用了total而不是nameTotal,谢谢!
select t.*
from t
where exists (select 1
              from t t2
              where t2.name = t.name and
                    t2.total > 0
             );