मेरे पास दो मानों में से एक, 'ए' या 'आई' वाला कॉलम है। मैं हमेशा 'मैं' वापस करना चाहता हूं, लेकिन अगर 'ए' मौजूद नहीं है, तो इस मामले में, 'ए' वापस करें।

उदाहरण तालिका:

Name   | Active?
----------------
Steve  |   A
Steve  |   I
Steve  |   I
Andrew |   I
Mark   |   A
Mark   |   I
Carl   |   I
Carl   |   I

उदाहरण परिणाम:

Name   | Active?
----------------
Steve  |   A
Andrew |   I
Mark   |   A
Carl   |   I
Carl   |   I

ध्यान दें कि [नाम] 'कार्ल' के [सक्रिय?] फ़ील्ड में दो 'I' मान हैं, इसलिए यह दोनों उदाहरण देता है। [नाम] स्टीव के पास दो 'I' मान भी हैं, लेकिन एक 'A' मान भी है, इसलिए 'I' को अनदेखा कर दिया जाता है और 'A' वापस कर दिया जाता है।

1
Josiah Thames 10 मार्च 2020, 16:04

3 जवाब

आप not exists का उपयोग कर सकते हैं:

select t.*
from t
where t.active = 'A' or
      (t.active = 'I' and
       not exists (select 1
                   from t t2
                   where t2.name = t.name and t2.active = 'A'
                  );

आप विंडो फ़ंक्शंस का भी उपयोग कर सकते हैं:

select t.*
from (select t.*,
             sum(case when active = 'A' then 1 else 0 end) over (partition by name) as num_a
      from t
     ) t
where (active = 'A' and num_a > 00 or
      num_a = 0;
3
Gordon Linoff 10 मार्च 2020, 16:07
वाह, त्वरित और प्रभावी प्रतिक्रिया। धन्यवाद!
 – 
Josiah Thames
10 मार्च 2020, 16:20

सटीक तरीका उपयोग कर रहा है

मौजूद नहीं

T.* को t से चुनें जहां t.active = 'A' या (t.active = 'I' और मौजूद नहीं है (t t2 से 1 चुनें जहां t2.name = t.name और t2.active = 'A');

0
Mohamed Safras 10 मार्च 2020, 16:48

अधिक सेट दृष्टिकोण:

SELECT t.Name, ISNULL(A."Active?", I."Active?") AS "Active?"
FROM "Example Table" AS t
LEFT JOIN "Example Table" AS A
  ON t.Name = A.Name AND A."Active?" = 'A'
LEFT JOIN "Example Table" AS I
  ON t.Name = I.Name AND I."Active?" <> 'A'
GROUP BY t.Name, A.Name, A."Active?", I.Name, I."Active?"
0
Leszek Mazur 10 मार्च 2020, 17:02