मैं 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 नहीं है।
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
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
आप विंडो फ़ंक्शंस का उपयोग कर सकते हैं। विचार यह है कि प्रति 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
संबंधित सवाल
नए सवाल
sql-server
Microsoft SQL सर्वर एक रिलेशनल डेटाबेस मैनेजमेंट सिस्टम (RDBMS) है। कॉम्पैक्ट, एक्सप्रेस, एज़्योर, फास्ट-ट्रैक, एपीएस (पूर्व में पीडीडब्ल्यू) और एज़्योर SQL डीडब्ल्यू सहित सभी SQL सर्वर संस्करणों के लिए इस टैग का उपयोग करें। अन्य प्रकार के DBMS (MySQL, PostgreSQL, Oracle, आदि) के लिए इस टैग का उपयोग न करें। सॉफ़्टवेयर और मोबाइल विकास के मुद्दों के लिए इस टैग का उपयोग न करें, जब तक कि यह सीधे डेटाबेस से संबंधित न हो।