2011-05-26 2 views
0

Scénario 1:Group By & Éliminez différentes valeurs

Tableau:

id column1 column2 
1 "bla" "foo" 
2 "bla" "bar" 

Je veux groupe par column1 et obtenir nulle pour column2, parce qu'il n'y a pas la même valeur dans toutes les lignes.

Scénario 2:

Tableau:

id column1 column2 
1 "bla" "foo" 
2 "bla" "foo" 

Je veux groupe par column1 et obtenir foo pour column2, cause toutes les valeurs de column2 sont égales.

Est-il possible de résoudre cela par une déclaration SQL?

Répondre

2

Puisque vous voulez regrouper par column1, une façon de savoir si column2 a toutes les mêmes valeurs est de vérifier si max(column2) = min(column2), donc cela devrait fonctionner:

select column1, case 
        when max(column2) = min(column2) then max(column2) 
        else null 
       end as col2 
    from tabletest 
group by column1; 

Modifier

Si votre column2 ne peut pas accepter null valeurs, la requête ci-dessus est ok, sinon vous devez la suivante pour traiter les cas où column2 est null:

select t.column1, case 
         when (select max(1) from tabletest where column2 is null and column1 = t.column1) = 1 then null 
         when max(t.column2) = min(t.column2) then max(t.column2) 
         else null 
        end as col2 
    from tabletest t 
group by t.column1; 

La seule différence est que nous avons besoin d'ajouter une condition case pour couvrir le cas quand column2 is null

+0

Cela devrait être beaucoup plus rapide que la sous-sélection ou la jointure. Agréable. –

+0

Si la colonne 2 peut contenir des valeurs NULL, cela ne fonctionnera pas si vous avez deux lignes, une avec une valeur NULL et une avec une valeur. – eaolson

+0

@eaolson Merci d'avoir signalé cela. J'ai proposé une nouvelle requête pour cela –

0

Essayez ceci:

select id = t.id , 
     col1 = t.col1 , 
     col2 = case when t1.N < 2 then t.col2 end 
from myTable t 
join (select col1,N=count(distinct col2) 
     from myTable 
     group by col1 
    ) t1 on t1.col1 = t.col1