使用 SQL 过滤 Table 我需要根据另一列对一列的多行求和
Use SQL To Filter Table Where I Need to Sum Multiple Rows Of A Column Based On Another Column
我正在尝试过滤 table,其中有多个行表示一个会员购买商品的每家商店。加上购买的肉类和蔬菜数量 table 的列。我想要一份人员名单以及他们购买肉类 和 蔬菜 tables.
的所有商店
来源table:
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
我要应用的过滤器是:
对于 MemberId(跨所有商店):WHERE SUM(Meat) > 0 AND SUM(Vegetables) > 0
所以我正在寻找这个结果 table
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
这让我很困惑,我不知道如何过滤这个 table。
谢谢
这可以使用 sum
window 函数来完成。
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)
我正在尝试过滤 table,其中有多个行表示一个会员购买商品的每家商店。加上购买的肉类和蔬菜数量 table 的列。我想要一份人员名单以及他们购买肉类 和 蔬菜 tables.
的所有商店来源table:
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
我要应用的过滤器是:
对于 MemberId(跨所有商店):WHERE SUM(Meat) > 0 AND SUM(Vegetables) > 0
所以我正在寻找这个结果 table
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
这让我很困惑,我不知道如何过滤这个 table。
谢谢
这可以使用 sum
window 函数来完成。
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)