Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/.htaccess/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用SQL筛选需要基于另一列对一列的多行求和的表_Sql_Sql Server_Where Clause_Having Clause - Fatal编程技术网

使用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)