Comment puis-je sélectionner distinct par une colonne?

J'ai une table avec les colonnes ci-dessous, et j'ai besoin d'get les valeurs si COD est dupliqué, get la colonne non NULL sur VALUE. Si n'est pas dupliqué, il peut get une valeur NULL. Comme l'exemple:

J'utilise SQL SERVER.

C'est ce que je reçois:

COD ID VALUE 28 1 NULL 28 2 Supermarket 29 1 NULL 29 2 School 29 3 NULL 30 1 NULL 

C'est ce que je veux:

 COD ID VALUE 28 2 Supermarket 29 2 School 30 1 NULL 

Ce que j'essaie de faire:

 ;with A as ( (select DISTINCT COD,ID,VALUE from CodId where ID = 2) UNION (select DISTINCT COD,ID,NULL from CodId where ID != 2) )select * from A order by COD 

Tu peux essayer ça.

 DECLARE @T TABLE (COD INT, ID INT, VALUE VARCHAR(20)) INSERT INTO @T VALUES(28, 1, NULL), (28, 2 ,'Supermarket'), (29, 1 ,NULL), (29, 2 ,'School'), (29, 3 ,NULL), (30, 1 ,NULL) ;WITH CTE AS ( SELECT *, RN= ROW_NUMBER() OVER (PARTITION BY COD ORDER BY VALUE DESC) FROM @T ) SELECT COD, ID ,VALUE FROM CTE WHERE RN = 1 

Résultat:

 COD ID VALUE ----------- ----------- -------------------- 28 2 Supermarket 29 2 School 30 1 NULL 

Une autre option consiste à utiliser la clause WITH TIES de concert avec Row_Number()

Exemple

 Select top 1 with ties * from YourTable Order By Row_Number() over (Partition By [COD] order by Value Desc) 

Résultats

 COD ID VALUE 28 2 Supermarket 29 2 School 30 1 NULL 

J'utiliserais GROUP BY et JOIN . S'il n'y a pas de NOT NULL pour un COD que cela devrait être résolu en utilisant la clause OR dans JOIN .

  SELECT your_table.* FROM your_table JOIN ( SELECT COD, MAX(value) value FROM your_table GROUP BY COD ) gt ON your_table.COD = gt.COD and (your_table.value = gt.value OR gt.value IS NULL) 

Si vous avez plus d'une valeur non nulle pour un COD, cela fonctionnera

 drop table MyTable CREATE TABLE MyTable ( COD INT, ID INT, VALUE VARCHAR(20) ) INSERT INTO MyTable VALUES (28,1, NULL), (28,2,'Supermarket'), (28,3,'School'), (29,1,NULL), (29,2,'School'), (29,3,NULL), (30,1,NULL); WITH Dups AS (SELECT COD FROM MyTable GROUP BY COD HAVING count (*) > 1 ) SELECT MyTable.COD,MyTable.ID,MyTable.VALUE FROM MyTable INNER JOIN dups ON MyTable.COD = Dups.COD WHERE value IS NOT NULL UNION SELECT MyTable.COD,MyTable.ID,MyTable.VALUE FROM MyTable LEFT JOIN dups ON MyTable.COD = Dups.COD WHERE dups.cod IS NULL