2013-03-14 3 views
1

Par exemple, pour une table comme ci-dessousrequête SQL pour l'extraction de lignes qui ne sont pas même pour un groupe donné

c1  c2  c3 
a  b  1 
a  b  2 
c  d  1 
c  d  1 
e  f  3 
e  f  3 
e  f  3 
x  y  5 

Dans ce scénario, je veux la valeur du groupe de c1, c2 où tous au moins l'un des le c3 n'est pas le même. Donc, dans ce cas (a, b), une ligne de (a, b) est 1 et une autre ligne de (a, b) est 2.

La ligne (x, y) ne doit pas non plus être reportée.

+0

Et si (g, h, 1), (g, h , 2) et (g, h, 2) sont des valeurs que vous ne voulez pas (g, h) retournées non plus? Renvoie seulement 'c1' et' c2' si les valeurs ** all ** 'c3' diffèrent? – Josien

+0

Je pense que vous devez être plus précis sur la logique derrière vos résultats attendus. Pourquoi (x, y) ne devrait-il pas être signalé? Et que se passerait-il avec le (g, h) de mon commentaire précédent? – Josien

Répondre

4
SELECT c1, c2 
FROM tableName 
GROUP BY c1, c2 
HAVING COUNT(DISTINCT c3) > 1 

SORTIE

╔════╦════╗ 
║ C1 ║ C2 ║ 
╠════╬════╣ 
║ a ║ b ║ 
╚════╩════╝ 

mais vous voulez obtenir toutes les lignes avec toutes ses colonnes

SELECT a.* 
FROM tableName a 
     INNER JOIN 
     (
      SELECT c1, c2 
      FROM tableName 
      GROUP BY c1, c2 
      HAVING COUNT(DISTINCT c3) > 1 
     ) b ON a.c1 = b.c1 AND 
       a.c2 = b.c2 

SORTIE

╔════╦════╦════╗ 
║ C1 ║ C2 ║ C3 ║ 
╠════╬════╬════╣ 
║ a ║ b ║ 1 ║ 
║ a ║ b ║ 2 ║ 
╚════╩════╩════╝ 
+0

Si vous ajoutez (g, h, 1), (g, h, 2) et (g, h, 2) aux valeurs, ces requêtes renverront également (g, h). Je ne suis pas sûr que c'est ce que le demandeur cherche ... – Josien

+0

@Josien exactement parce que les c3 sont différents. –

+0

Hm oui, je suis dans le doute à cause de la déclaration «où tous les c3 ne sont pas les mêmes» dans la question. La différence entre «certains c3 devrait différer» et «TOUT c3 devrait différer». Mais je pense que nous avons besoin de plus d'informations :-) – Josien

1

Utilisation EXISTS:

SELECT c1, c2, c3 
FROM dbo.TableName t1 
WHERE EXISTS 
(
    SELECT 1 FROM dbo.TableName t2 
    WHERE t1.c1 = t2.c1 AND t1.c2 = t2.c2 
    AND t1.c3 <> t2.c3 
) 

Demo (si vous voulez juste un enregistrement, utilisez t1.c3 < t2.c3)

1

Edit: en fonction des paires simples non inclus:

Si vous souhaitez obtenir chaque paire, C1, C2, pour laquelle toutes les valeurs de C3 est différente, ce qui suit va le faire:

SELECT 
    C1, 
    C2 
FROM 
    dbo.Table1 
GROUP BY 
    C1, 
    C2 
HAVING 
    COUNT(1) = COUNT(DISTINCT C3) 
AND COUNT(1) > 1 
Questions connexes