2017-10-20 22 views
0

Comment puis-je sélectionner tous les enregistrements pour lesquels toutes les valeurs de code ne sont pas 651, 652, 655, 656 pour un ID unique.Sélection d'une requête pour exclure les valeurs de groupe par colonne

table Source avec 3 colonnes

ID Line Code 
1 1 651 
1 2 652 
1 3 655 
2 1 650 
2 2 652 
3 1 651 
3 2 655 
3 3 651 
3 4 658 
4 1 651 
4 2 651 

Je veux récupérer tous les enregistrements où pas tout le code est l'un des 651/652/655/656 pour un ID

ensemble de données nécessaires seraient comme ci-dessous

ID Line Code 
2 1 650 
2 2 652 
3 1 651 
3 2 655 
3 3 651 
3 4 658 

Répondre

2

Essayez ceci:

SELECT t1.* 
FROM table1 as t1 
INNER JOIN 
(
    SELECT DISTINCT ID 
    FROM table1 AS t1 
    LEFT JOIN 
    (
    SELECT 651 AS code UNION SELECT 652 UNION 
    SELECT 655 UNION SELECT 656 
) AS t2 ON t1.code = t2.code 
    WHERE t2.code is NULL 
) AS t2 ON t1.id = t2.id; 

demo * (démo pour MySQL, mais toujours le même pour le serveur SQL 2005)

| ID | Line | Code | 
|----|------|------| 
| 2 | 1 | 650 | 
| 2 | 2 | 652 | 
| 3 | 1 | 651 | 
| 3 | 2 | 655 | 
| 3 | 3 | 651 | 
| 3 | 4 | 658 | 
+0

@ RasmusDybkjær - Merci, j'ai édité ma réponse. –

+0

@ RasmusDybkjær 'IN()' était certainement disponible en 2005 ... –

+0

l'agrégation conditionnelle dans une sous-requête serait une autre option – Matt

0

Vous vérifier où il existe un code pas dans ces valeurs pour le LineItem. Cela peut être fait via une sous-requête. Par exemple:

DECLARE @temp TABLE (ID int, Line int, Code int) 
INSERT INTO @temp VALUES 
(1, 1, 651),(1, 2, 652),(1, 3, 655),(2, 1, 650),(2, 2, 652),(3, 1, 651) 
,(3, 2, 655),(3, 3, 651),(3, 4, 658),(4, 1, 651),(4, 2, 651) 

SELECT ID, Line, Code 
    FROM @temp T1 
WHERE EXISTS (SELECT * 
       FROM @temp T2 
       WHERE T2.ID = T1.ID 
        AND T2.Code NOT IN (651, 652, 655, 656) 
      ) 
0

Voici une méthode sans utiliser IN ou Exists. Il utilise l'agrégation conditionnelle dans une sous-requête pour déterminer s'il existe plus d'enregistrements que les codes indésirables par ID, puis revient à la table d'origine pour obtenir plus de détails.

DECLARE @Table AS TABLE (ID int, Line INT, Code INT) 

INSERT INTO @Table (ID, Line, Code) 
VALUES (1, 1, 651),(1, 2, 652),(1, 3, 655),(2, 1, 650),(2, 2, 652) 
     ,(3, 1, 651),(3, 2, 655),(3, 3, 651),(3, 4, 658),(4, 1, 651) 
     ,(4, 2, 651) 

SELECT t1.* 
FROM 
    @Table t1 
    INNER JOIN (
     SELECT 
      ID 
     FROM 
      @Table 
     GROUP BY 
      ID 
     HAVING 
      COUNT(*) > COUNT(CASE WHEN Code = 651 OR Code = 652 OR Code = 655 OR Code = 656 THEN Code END)) t2 
    ON t1.ID = t2.ID