วันศุกร์ที่ 27 พฤศจิกายน พ.ศ. 2552

MDX Query : Where clause with dimensions slice & dice

บทความนี้จะกล่าวถึง Basic MDX Query ที่อาจทำให้เรา Query ข้อมูลผิดพลาด
ในความเคยชินของผู้ใช้งาน RDBMS ทั่วไปนั้นแน่นอนว่าการ Filter ข้อมูลก็คือการใส่ เงื่อนไขหลัง WHERE
ใน SQL Statement ยกตัวอย่างง่าย ๆ ของการหายอดขายของ ภูมิภาคยุโรป ที่มีชื่อประเทศตั้งแต่ฝรั่งเศษ - เยอรมันนี

SELECT sum(sales_amount)
FROM sales
WHERE Region ='EUROPE'
AND Country Between 'France' AND 'Germany'

ซึ่งก็จะได้ข้อมูลถูกต้องแน่นอนครับ แต่หากเราจะประยุกต์ Query นี้เพื่อใช้กับ MDX แล้วผลลัพธ์จะไม่ได้ตามต้องการ
ในที่นี้ผมขอยกตัวอย่างจาก Adventure Works ของ Microsoft นะครับ
Query ในแบบที่น่าจะเป็น


SELECT {[Measures].[Internet Order Quantity],[Measures].[Internet Sales Amount]}
on 0
FROM [Adventure Works]
WHERE
(
[Sales Territory].[Sales Territory Group].&[Europe]
,{[Sales Territory].[Sales Territory Country].&[France]: [Sales Territory].[Sales Territory Country].&[Germany]}
)



ผลลัพธ์ที่ได้คือ ให้สังเกตตรงผลรวมด้านบนไว้นะครับ
จะเห็นว่า Internet Order Quantity = 18,089

ส่วนอันนี้เป็น Query ที่ให้ผลลัพธ์ถูกต้อง (มีหลายรูปแบบนะครับ)
SELECT {[Measures].[Internet Order Quantity],[Measures].[Internet Sales Amount]}
on 0
,[Sales Territory].[Sales Territory Country].members on 1
FROM
(SELECT
{[Sales Territory].[Sales Territory Country].&[France]:
[Sales Territory].[Sales Territory Country].&[Germany]} ON 0
FROM [Adventure Works] WHERE
[Sales Territory].[Sales Territory Group].&[Europe])


ผลลัพธ์ที่ได้ จะเห็นว่ายอดลดลงเหลือ 11,183 เท่านั้น อาจสงสัยว่าแล้วยอด 18,089 มาจากไหน
คำตอบคือเป็นยอดทั้งหมดของยุโรปครับ ซึ่งใน Database มีอยู่ 3 ประเทศด้วยกันตามนี้

SELECT {[Measures].[Internet Order Quantity],[Measures].[Internet Sales Amount]}
on 0
,
[Sales Territory].[Sales Territory Country].MEMBERS
on 1
FROM [Adventure Works]
WHERE
[Sales Territory].[Sales Territory Group].&[Europe]





เหตุผลที่ Query ในรูปแบบของ RDBMS เกิดข้อผิดพลาดขึ้นในกรณีนี้ก็คือเรื่อง Heirachy ของ Dimension ครับ
กล่าวคือใน Level ที่อยู่สูงกว่าจะมียอด Summary ของ Measurement เก็บไว้
ไม่ว่าเราจะใช้ Where ในการ Filter ข้อมูลใน Level ที่ต่ำลงมาก็จะไม่ทำให้ข้อมูลใน Parent level เปลี่ยนไปตามเงื่อนไข (ยกเว้นการทำ Sub Selection)
ดังนั้นต้องระวังในข้อนี้ให้ดีครับ เพราะสิ่งเหล่านี้จะพื้นฐานของการนำไปสร้างรายงานสำหรับ User ต่อไป
ในเรื่องของการรับ Parameter

2 ความคิดเห็น: