ग्रुप बाय बी, ए और ग्रुप बाय कोलसेसी (बी, ए) के बीच अंतर


20

मैं अपने आप को बहुत भ्रमित हो रहा है।

क्या कोई कृपया बता सकता है कि मैं किन परिस्थितियों में ग्रुप बाय कॉल का उपयोग करना चाहूंगा?

मेरा अनुमान है कि मैं इसका उपयोग तब करूंगा जब मैं कॉलम बी (यदि बी शून्य नहीं था) और कॉलम ए द्वारा अन्यथा डेटा का एक सेट समूह को देना चाहता था। क्या यह सही है?

जवाबों:


37

साथ GROUP BY b,atuples (null, 1), (1,1), (2,1)और (17,1)चार अलग अलग समूहों में समाप्त होगा।

साथ GROUP BY coalesce(b,a)tuples (null,1), (1,1), (2,1)और (17,1)एक ही समूह में खत्म हो जाएगा।

यदि आप "सशर्त" समूहीकरण चाहते हैं, तो हां, इसके साथ संस्करण coalesceसंभवतः वही है जो आप चाहते हैं।


क्रिस दिनांक : "एक 'प्रकार' जिसमें एक शून्य है एक प्रकार नहीं है (क्योंकि प्रकार में मान होते हैं)। एक 'ट्यूपल' जिसमें एक शून्य होता है एक ट्यूपल नहीं होता है (क्योंकि ट्यूपल में मान होते हैं)।"
onedaywhen

@onedaywhen: ठीक है, यह सिद्धांत और व्यवहार के बीच का अंतर है;)
a_horse_with_no_name

मेरी बात: यह एक संबंध में एक टपल और SQL टेबल एक्सप्रेशन में एक पंक्ति के बीच का अंतर है। सिद्धांत में और व्यवहार में, एक टपल SQL पर लागू नहीं होता है।
onayaywhen

@onedaywhen: तो आपका मतलब है कि मुझे अपना शब्द बदलना चाहिए? आप SQL में दो (स्तंभ) मानों के संयोजन को व्यक्त करने के लिए किस शब्द की सिफारिश करेंगे? जरूरी नहीं कि वे एक ही टेबल से हों और न ही पूरी पंक्ति हो।
a_horse_with_no_name

1
उदाहरण के लिए, ट्यूटोरियल डी, के TUPLE { a 17 , b 1 }रूप में ही है TUPLE { b 1 , a 17 }, लेकिन SQL में पंक्ति मान निर्माता पंक्ति मान निर्माता (17, 1)के समान नहीं है (1, 17)। यही कारण है कि आपके "जोड़े" ट्यूपल्स नहीं हैं। क्योंकि आपने एक पंक्ति प्रकार के निर्माता को छोड़ दिया है, मुझे उस संदर्भ से मान लेना चाहिए जो वे इसके (a, b)बजाय हैं, (b, a)लेकिन इसका समावेश अभी भी इसे तुच्छ नहीं बनाएगा। इसके विपरीत, TUPLE { 17 , 1 }ट्यूटोरियल डी में न तो मान्य ट्यूपल मंगलाचरण है, न ही है TUPLE { a null , b 1 }
onayaywhen

16

यहाँ a_horse_with_no_name के उत्कृष्ट +1 उत्तर का प्रदर्शन है ।

SQL> WITH Data AS (
  2     SELECT level, DECODE(Level,3,NULL,1) A
  3        , DECODE(level,2,NULL,4,2,1) B
  4     FROM dual connect by level <=5
  5     )
  6  SELECT A, B, count(*) FROM Data GROUP BY B, A;

A B   COUNT(*)
- - ----------
1 1          2
1            1
1 2          1
  1          1


SQL> WITH Data AS (
  2     SELECT level, DECODE(Level,3,NULL,1) A
  3        , DECODE(level,2,NULL,4,2,1) B
  4     FROM dual connect by level <=5
  5     )
  6  SELECT COALESCE(B, A) X, count(*) FROM Data GROUP BY COALESCE(B, A);

X   COUNT(*)
- ----------
1          4
2          1

2
अच्छा प्रदर्शन!
a_horse_with_no_name

मुझे 'लेवल' के बारे में सोचने के लिए रिफ्लेक्स लेना पड़ता है, यह बहुत उपयोगी है!
ल्यूक एम
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.