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