ความแตกต่างระหว่าง GROUP BY B, A และ GROUP BY COALESCE (B, A)


20

ฉันสับสนตัวเองมาก

มีใครบางคนกรุณาอธิบายภายใต้สถานการณ์ที่ฉันต้องการใช้ GROUP BY COALESCE

ฉันเดาว่าฉันจะใช้มันถ้าฉันต้องการจัดกลุ่มชุดข้อมูลตามคอลัมน์ B แบบมีเงื่อนไข (ถ้า B ไม่ใช่โมฆะ) และคอลัมน์ A เป็นอย่างอื่น เสียงนั้นใช่ไหม

คำตอบ:


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อาจเป็นสิ่งที่คุณต้องการ


Chris Date : "A 'type' ที่มีค่า Null ไม่ใช่ชนิด (เนื่องจากชนิดมีค่า) A 'tuple' ที่มีค่า Null ไม่ใช่ชนิดของ Tuple (เนื่องจาก tuples มีค่า)
oneday

@onedaywhen: ดีนั่นคือความแตกต่างระหว่างทฤษฎีและการปฏิบัติ;)
a_horse_with_no_name

จุดของฉัน: นั่นคือความแตกต่างระหว่างทูเปิลในความสัมพันธ์และแถวในนิพจน์ตาราง SQL tuple ใช้ไม่ได้กับ SQL ทั้งในเชิงทฤษฎีและในทางปฏิบัติ
oneday

@onedaywhen: ดังนั้นคุณหมายถึงฉันควรเปลี่ยนถ้อยคำของฉัน? คำใดที่คุณอยากจะแนะนำให้แสดงการรวมกันของสองค่า (คอลัมน์) ใน SQL? พวกเขาไม่จำเป็นต้องมาจากตารางเดียวกันหรือเป็นแถวที่สมบูรณ์
a_horse_with_no_name

1
ยกตัวอย่างเช่นในการสอน D, TUPLE { a 17 , b 1 }เป็นเช่นเดียวTUPLE { b 1 , a 17 }แต่ใน SQL ตัวสร้างมูลค่าแถวจะไม่เหมือนกันเป็นตัวสร้างมูลค่าแถว(17, 1) (1, 17)นี่คือเหตุผลที่ "คู่" ของคุณไม่ใช่สิ่งอันดับ เนื่องจากคุณไม่ได้กำหนดตัวสร้างประเภทแถวฉันจึงต้องสมมติจากบริบทที่เป็น(a, b)มากกว่า(b, a)แต่การรวมไว้จะไม่ทำให้ tuple ในทางตรงกันข้ามTUPLE { 17 , 1 }ไม่ได้เป็นภาวนา tuple ที่ถูกต้องในการกวดวิชา D, TUPLE { a null , b 1 }ไม่เป็น
oneday

16

นี่คือตัวอย่างคำตอบ+1 ที่ยอดเยี่ยมของ a_horse_with_no_name

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

ฉันต้องคิดทบทวนเกี่ยวกับ 'ระดับ' มันมีประโยชน์มาก ๆ !
Luc M
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.