2017-10-16 110 views
0

我试图筛选一个表,其中有多个行,针对每个商店的单个成员他们已经购买了项目。加上购买肉类和蔬菜物品数量的列。我想要一份人员名单和他们购买肉类的所有商店的名单蔬菜。使用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

这让我很难过,我无法弄清楚如何过滤这张表。

感谢

回答

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 
+0

感谢您的快速,正确,答案。 –

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; 
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) 
相关问题