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
);