2017-10-16 10 views
0

J'essaie de filtrer une table, où il y a plusieurs lignes pour un seul membre pour chaque magasin où ils ont acheté des articles. Plus colonnes pour le nombre de viande et de légumes achetés. Je veux avoir une liste de personnes et tous les magasins où ils ont acheté de la viande et légumes.Utiliser SQL pour filtrer la table où j'ai besoin de sommer plusieurs lignes d'une colonne basée sur une autre colonne

table Source:

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

Le filtre que je veux appliquer est:

Pour un MemberID (dans tous les magasins): OÙ SOMME (viande)> 0 ET SOMME (légumes)> 0

Je suis à la recherche de ce tableau résultats

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

Cela m'a étonné et je ne peux pas savoir comment filtrer cette table.

Merci

Répondre

1

Cela peut être fait en utilisant sum fonction de la fenêtre.

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

Merci pour votre rapide et correcte, réponse. –

0

Vous pouvez utiliser 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

méthode Simplest je peux penser à:

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)