2017-10-13 1 views
2

I ont la table source comme indiqué ci-dessous:SQL plusieurs enregistrements

ID Status State_id 
X Active 1 
X Active 2 
X Active 3 
X Active 4 
Y Active 2 
Y Active 3 
Z Active 1 
Z Active 2 
Z Active 3 
A Active 2 
A Active 3 

je besoin de 2 sortie basée sur state_id 2,3.

Set 1 pour avoir seulement 2,3 state_id

ID Status 
Y Active 
A Active 

Set 2 pour avoir carte d'identité nationale supplémentaire avec 2,3

ID Status 
X Active 
Z Active 
+0

'SELECT ID, état à partir TBL OÙ state_id IN (2,3) et l'ID dans ('Y', 'A')' base de données qui ne tu utilises? Quelle est la différence entre Set 1 et Set 2? Est-ce le nombre d'entrées actives? – cSteusloff

+0

Quel produit [DBMS] (https://fr.wikipedia.org/wiki/DBMS) utilisez-vous? Postgres? Oracle? "_SQL_" est juste un langage de requête, pas le nom d'un produit de base de données spécifique. –

Répondre

0
/*Set 1*/ 
    select t1.id, t1.status 
    from table1 t1 
    where t1.state_id in (2, 3) /*ids you want */ 
    and t1.id not in ((
    select distinct t2.id 
    from table1 t2 
    where t2.state_id in (1, 4) /*ids you dont want*/ 
)) 
    group by t1.id, t1.status 

suffit de retourner les ID pour obtenir set 2

+0

Voici le violon: http://sqlfiddle.com/#!9/15a90c/54 – tommyO

0

Je pense qu'il devrait vous donner résultat escompté.

Mise à jour SqlFiddle

--Set 1 
SELECT id ,status 
FROM table1 
-- WHERE status='Active' 
GROUP BY id ,status 
HAVING COUNT(DISTINCT state_id) =count(DISTINCT CASE WHEN state_id IN (2,3) THEN state_id END) ; 

--Set2 
SELECT id ,status 
FROM table1 
GROUP BY id ,status 
HAVING COUNT(DISTINCT state_id)>count(DISTINCT CASE WHEN state_id IN (2,3) 
    THEN state_id END) 
AND COUNT(DISTINCT CASE WHEN state_id IN (2,3) THEN state_id END) =2; 
+0

Non, ils ne donnent pas les résultats attendus – vkase

+0

@vkase: oui, mis à jour .... – a1ex07

0

Vous pouvez utiliser ces scripts.

Set 1

SELECT 
    ID, Status 
FROM 
    @Tbl T 
GROUP BY 
    ID, Status 
HAVING 
    SUM(CASE WHEN State_id IN (2,3) THEN 1 ELSE 0 END) = 2 
    AND SUM(CASE WHEN State_id IN (2,3) THEN 0 ELSE 1 END) = 0 

Résultat:

ID Status 
---- ---------- 
A Active 
Y Active 

Set 2

SELECT 
    ID, Status 
FROM 
    @Tbl T 
GROUP BY 
    ID, Status 
HAVING 
    SUM(CASE WHEN State_id IN (2,3) THEN 1 ELSE 0 END) = 2 
    AND SUM(CASE WHEN State_id IN (2,3) THEN 0 ELSE 1 END) > 0 

Résultat:

ID Status 
---- ---------- 
X Active 
Z Active