使用SQL筛选需要基于另一列对一列的多行求和的表
我正在尝试筛选一个表,其中每个成员在其中购买商品的商店都有一个成员的多行。加上购买的肉类和蔬菜数量列。我想要一份名单,上面列有人们和他们购买肉类和蔬菜的所有商店 源表:使用SQL筛选需要基于另一列对一列的多行求和的表,sql,sql-server,where-clause,having-clause,Sql,Sql Server,Where Clause,Having Clause,我正在尝试筛选一个表,其中每个成员在其中购买商品的商店都有一个成员的多行。加上购买的肉类和蔬菜数量列。我想要一份名单,上面列有人们和他们购买肉类和蔬菜的所有商店 源表: MemberId | StoreId |肉类|蔬菜表 1 11 1 2 1 12 0 1 1 14 1 2 2 12 1
MemberId | StoreId |肉类|蔬菜表
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
我要应用的筛选器是:
对于MemberId(所有门店):其中SUM(肉类)>0,SUM(蔬菜)>0
所以我在找这个结果表
MemberId | StoreId |肉类|蔬菜
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)