使用SQL来筛选表中我需要根据另一列累加多列的行
问题描述:
我试图筛选一个表,其中有多个行,针对每个商店的单个成员他们已经购买了项目。加上购买肉类和蔬菜物品数量的列。我想要一份人员名单和他们购买肉类的所有商店的名单和蔬菜。使用SQL来筛选表中我需要根据另一列累加多列的行
源表:
MemberId | StoreId | Meat | Vegegetables 1 11 1 2 1 12 0 1 1 14 1 2 2 12 1 0 3 12 1 0 3 12 1 0 4 11 2 1 4 13 0 1 4 14 0 1
我想申请的过滤器是:
对于成员Id(所有商店):WHERE SUM(肉类)> 0 AND SUM(蔬菜)> 0
所以我在寻找这个结果表
MemberId | StoreId | Meat | Vegetables 1 11 1 2 1 12 0 1 1 14 1 2 4 11 2 1 4 13 0 1 4 14 0 1
这让我很难过,我无法弄清楚如何过滤这张表。
感谢
答
这可以通过使用sum
窗函数来完成。
select * from (
select t.*,sum(meat) over(partition by memberid) as meat_sum,sum(vegetables) over(partition by memberid) as veg_sum
from source_table t
) t
where meat_sum>0 and veg_sum>0
答
你可以使用CTE:
;WITH CTE AS
(
SELECT MemberID ,
SUM(Meat) AS Meat ,
SUM(Vegetables) AS Vegetables
FROM Table
GROUP BY MemberID
)
SELECT Table.*
FROM Table
INNER JOIN CTE ON CTE.MemberID = Table.MemberID
WHERE CTE.Meat > 0 AND CTE.Vegetables > 0;
答
最简单的方法我能想到的:
create table #test (MemberID int, StoreID int, Meat int, Vegetables int)
insert into #test values (1, 11, 1, 2)
insert into #test values (1, 12, 0, 1)
insert into #test values (1, 14, 1, 2)
insert into #test values (2, 12, 1, 0)
insert into #test values (3, 12, 1, 0)
insert into #test values (3, 12, 1, 0)
insert into #test values (4, 11, 2, 1)
insert into #test values (4, 13, 0, 1)
insert into #test values (4, 14, 0, 1)
Select *
from #test
where MemberID in (Select MemberId
from #test
group by MemberId, storeID
having sum(Meat)>0 and sum(vegetables)>0)
感谢您的快速,正确,答案。 –