मैं SQL सर्वर 2012 के साथ काम करता हूं। मुझे तालिका #gen से पंक्तियाँ नहीं मिल सकती हैं, जब उनके पास Zplid के आधार पर फीचर कुंजी कॉलम में कम से कम एक NULL और कम से कम गैर-NULL मान वाली पंक्तियाँ हों। और CodeTypeId

मतलब मुझे उन पंक्तियों को प्राप्त करने की आवश्यकता है जिनमें फीचर कुंजी में NULL और फीचर कुंजी में मान हैं, लेकिन समान CodeTypeId और समान Zplid होना चाहिए।

create table #gen
(
    CodeTypeId int,
    Zplid  int,
    Zfeaturekey nvarchar(50)
)

insert into #gen 
values (854838, 25820, NULL),
       (849774, 25820, 1502260001),
       (849774, 25820, 1502260001),
       (849774, 25820, 1502260016),
       (849774, 25820, NULL),
       (987431, 26777, 1502270003),
       (987431, 26777, 1502280005),
       (987431, 26777, 1502290001)

यह वह परिणाम है जिसकी मुझे आवश्यकता है:

 CodeTypeId    Zplid    Zfeaturekey
 ------------------------------------
     849774    25820    1502260001
     849774    25820    1502260001
     849774    25820    1502260016
     849774    25820    NULL

मुझे CodeTypeId = 854838 और Zplid = 25820 वाली पंक्तियाँ नहीं मिलेंगी क्योंकि उनके पास केवल फीचर कुंजी में NULL है।

मुझे CodeTypeId = 987431 और Zplid = 26777 वाली पंक्तियाँ नहीं मिलेंगी क्योंकि उनके पास सुविधा कुंजी में NULL नहीं है।

0
ahmed barbary 8 पद 2020, 23:52

3 जवाब

सबसे बढ़िया उत्तर

इसके लिए मूल दृष्टिकोण यह होगा कि a) CodeTypeID और Zplid के संयोजन खोजें जिनमें NULL और गैर-NULL दोनों हों b) CodeTypeID और Zplid के संयोजन के संयोजन के लिए सभी पंक्तियों की रिपोर्ट करें

उदाहरण के लिए

SELECT g.*
FROM   #gen g
    INNER JOIN 
    (SELECT CodeTypeId, Zplid
      FROM  #gen 
      GROUP BY CodeTypeId, Zplid
      HAVING COUNT(*) > COUNT(Zfeaturekey) 
          AND COUNT(Zfeaturekey) >= 1
    ) AS g_filtered 
        ON g.CodeTypeId = g_filtered.CodeTypeId 
        AND g.Zplid= g_filtered.Zplid 

यह रहा एक db<>fiddle

1
seanb 9 पद 2020, 00:19

CTE का उपयोग करने से कोड सरल और अधिक सहज हो सकता है:

with cte
as(SELECT CodeTypeId, Zplid
      FROM  #gen 
      GROUP BY CodeTypeId, Zplid)

SELECT g.* FROM   #gen g
JOIN cte c
ON g.CodeTypeId = g_filtered.CodeTypeId AND g.Zplid= g_filtered.Zplid
WHERE COUNT(c.*) > COUNT(c.Zfeaturekey) 
          AND COUNT(c.Zfeaturekey) >= 1
0
Dale K 10 पद 2020, 06:10

आप विंडो फ़ंक्शंस का उपयोग कर सकते हैं। विचार यह है कि प्रति codetyped के सभी मानों की गणना की जाए और उसकी तुलना गैर-null मानों की संख्या से की जाए। फिर, हम उस जानकारी का उपयोग यह सुनिश्चित करने के लिए कर सकते हैं कि प्रति समूह कम से कम एक गैर-null मान और एक null मान हो।

select *
from (
    select g.*,
        count(*) over(partition by codetypeid) cnt,
        count(zfeaturekey) over(partition by codetypeid) cnt_not_nulls
    from #gen g
) g
where cnt > cnt_not_nulls and cnt_not_nulls > 0
0
GMB 9 पद 2020, 00:20