2017-10-16 125 views
5

Tôi có một bảng với các cột bên dưới và tôi cần nhận các giá trị nếu COD được sao chép, nhận cột không NULL trên cột VALUE. Nếu không được nhân bản, nó có thể nhận được một giá trị NULL. Giống như ví dụ:Làm cách nào để chọn một cột riêng biệt?

Tôi đang sử dụng SQL SERVER.

Đây là những gì tôi nhận được:

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

Đây là những gì tôi muốn:

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

Những gì tôi đang tryin' để làm:

;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 

Trả lời

8

Bạn có thể thử điều này.

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 

Kết quả:

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

Tôi sẽ sử dụng GROUP BYJOIN. Nếu không có giá trị NOT NULL cho số COD, thì giá trị này phải được giải quyết bằng cách sử dụng mệnh đề OR trong mệnh đề 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) 
5

Một lựa chọn khác là sử dụng WITH TIES điều khoản trong buổi hòa nhạc với Row_Number()

Ví dụ

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

Returns

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

Nếu bạn có thể có nhiều hơn một giá trị null không cho một COD này sẽ làm việc

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 
Các vấn đề liên quan