如何通过一列选择不同的?

Fal*_*nos 6 sql t-sql sql-server null distinct

我有一个包含下面列的表,如果COD重复,我需要获取值,在VALUE列上获取非NULL.如果不重复,则可以获得NULL VALUE.像例子一样:

我正在使用SQL SERVER.

这就是我得到的:

COD ID  VALUE
28  1   NULL
28  2   Supermarket
29  1   NULL
29  2   School
29  3   NULL
30  1   NULL
Run Code Online (Sandbox Code Playgroud)

这就是我要的:

COD ID  VALUE
28  2   Supermarket
29  2   School
30  1   NULL
Run Code Online (Sandbox Code Playgroud)

我正在尝试做什么:

;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
Run Code Online (Sandbox Code Playgroud)

Ser*_*lan 8

你可以试试这个.

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
Run Code Online (Sandbox Code Playgroud)

结果:

COD         ID          VALUE
----------- ----------- --------------------
28          2           Supermarket
29          2           School
30          1           NULL
Run Code Online (Sandbox Code Playgroud)


Joh*_*tti 6

另一种选择是使用该WITH TIES条款Row_Number()

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

返回

COD ID  VALUE
28  2   Supermarket
29  2   School
30  1   NULL
Run Code Online (Sandbox Code Playgroud)