ฉันสับสนตัวเองมาก
มีใครบางคนกรุณาอธิบายภายใต้สถานการณ์ที่ฉันต้องการใช้ GROUP BY COALESCE
ฉันเดาว่าฉันจะใช้มันถ้าฉันต้องการจัดกลุ่มชุดข้อมูลตามคอลัมน์ B แบบมีเงื่อนไข (ถ้า B ไม่ใช่โมฆะ) และคอลัมน์ A เป็นอย่างอื่น เสียงนั้นใช่ไหม
ฉันสับสนตัวเองมาก
มีใครบางคนกรุณาอธิบายภายใต้สถานการณ์ที่ฉันต้องการใช้ GROUP BY COALESCE
ฉันเดาว่าฉันจะใช้มันถ้าฉันต้องการจัดกลุ่มชุดข้อมูลตามคอลัมน์ B แบบมีเงื่อนไข (ถ้า B ไม่ใช่โมฆะ) และคอลัมน์ A เป็นอย่างอื่น เสียงนั้นใช่ไหม
คำตอบ:
ด้วยGROUP BY b,a
tuples (null, 1)
, (1,1)
, (2,1)
และ(17,1)
จะสิ้นสุดในสี่กลุ่มที่แตกต่างกัน
ด้วยGROUP BY coalesce(b,a)
tuples (null,1)
, (1,1)
, (2,1)
และ(17,1)
จะจบลงในกลุ่มเดียวกัน
หากคุณต้องการจัดกลุ่ม "เงื่อนไข" แล้วใช่รุ่นที่มีcoalesce
อาจเป็นสิ่งที่คุณต้องการ
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 }
ไม่เป็น
นี่คือตัวอย่างคำตอบ+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