2017-10-16 59 views
5

मेरे पास नीचे दिए गए कॉलम के साथ एक टेबल है, और यदि सीओडी डुप्लिकेट किया गया है तो मुझे मूल्य प्राप्त करने की आवश्यकता है, VALUE कॉलम पर गैर न्यूल प्राप्त करें। यदि डुप्लिकेट नहीं है, तो यह एक पूर्ण VALUE प्राप्त कर सकता है। उदाहरण की तरह:मैं एक कॉलम से अलग कैसे चुन सकता हूं?

मैं SQL सर्वर का उपयोग कर रहा हूं।

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

यह वह जगह है जो मैं चाहता:

यह मैं क्या मिलता है

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

क्या मैं 'कोशिश करने के लिए कर रहा हूँ:

;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 

उत्तर

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 

परिणाम:

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

मैं GROUP BY का प्रयोग करेंगे और JOIN। के लिए कोई NOT NULL मान नहीं है, तो इसे ORJOIN खंड में हल करके हल किया जाना चाहिए।

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

एक अन्य विकल्प उदाहरण

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

के साथ मिलकर WITH TIES खंड का उपयोग करना है

रिटर्न

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

आप एक सीओडी के लिए एक से अधिक गैर शून्य मान हो सकता है अगर यह काम करेगा

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 
संबंधित मुद्दे