2010-01-30 22 views
2

Je dois effectuer un groupe de, mais uniquement sur les lignes qui remplissent une condition, sinon retourner toutes les lignes qui ne remplissent pas la condition. Par exemple, dans le tableau suivant, je veux grouper uniquement les lignes qui ont '1' dans le champ "actif", et retourner toutes les lignes qui ne le font pas.Supprimer les lignes en double par valeur

TABLE (id, étiquette, actif):

1, A, 1 
2, A, 1 
3, B, 0 
4, B, 0 

renverrait:

1, A, 1 
3, B, 0 
4, B, 0 
+0

C'est une question assez ambiguë. En attente d'une mise à jour de taille significative. –

+0

où est l'exemple .. – Amirshk

Répondre

3

Voici la façon la plus simple que je peux penser. C'est une déclaration de cas dans le groupe par. Si la condition est remplie, grouper par étiquette, sinon grouper par clé primaire.

SELECT id, label, active 
FROM table 
GROUP BY 
    CASE 
    WHEN active = 1 THEN active 
    ELSE id END 

Si vous voulez groupe par actif et label:

SELECT id, label, active 
FROM table 
GROUP BY 
    CASE 
    WHEN active = 1 THEN active 
    ELSE id END, 
    label 

EDIT: Je mal compris quel domaine vous voulez groupe sur. Corrigé maintenant.

+0

Je l'aime quand la réponse est si simple Je suis gêné Je n'y ai pas pensé. – scader

0

Vous pouvez utiliser une instruction CASE

select min(id) as id, label, active 
from (
    select id, label, active, 
      case 
      when active = 1 then 'active' 
      else convert(varchar,newid()) as discriminator 
      end 
    from table) t 
group by label, active, discriminator 

cela donnera une valeur commune à toutes les lignes qui répondent à la condition (active = 1) et une valeur unique à toutes les autres lignes afin qu'elles restent dissociées .

Je n'ai pas accès au serveur SQL pour le moment, donc cela n'a pas été testé.

+0

Alors ... SELECT id, label, actif, cas si actif = 1 puis null else convert (varchar, newid()) fin en tant que groupe groupit par groupit Malheureusement, je vais utiliser fonctions d'agrégation sur un grand nombre d'autres champs qui sont également retournés, mais je pense que je peux obtenir les données brutes à grouper d'abord en tant que sous-sélection, puis rejoindre les données diverses. – scader

+0

Est-ce que la nouvelle ressource est intensive? – scader

+0

Je préfère ma méthode car il n'y a pas de sous-requête et la réutilisation du champ id comme l'option unique dans l'instruction case réduit un couple d'appels de fonction. Cependant, si vous y allez avec celui-ci, je pense que vous devez supprimer la colonne id de la clause GROUP BY. Sinon, toutes les lignes seront renvoyées sans regroupement. –

0

Peut-être la mise en page de la requête pourrait être quelque chose comme ceci:

Questions connexes