บทความนี้จะอธิบายถึงวิธีการใช้งาน Function Getdate() ใน MDX Query
ปกติหากจะหาวันที่ปัจจุบันใน SQL Server จะใช้ Function Getdate() และจัด Format ตามต้องการ
เช่น SELECT Convert(char(8),Getdate(),112)
แต่หากเป็นใน MDX Quey แล้ว จะแตกต่างกันไปนิดหน่อยโดยใช้ Function NOW() แทนครับ
ดูตามตัวอย่าง และนำไปประยุกต์ใช้เอาตามชอบใจ
WITH
MEMBER [Measures].[CurYear] as -- Current Year (Full)
Format(NOW(), "yyyy" )
MEMBER [Measures].[CurYearShot] as -- Current Year (With 2 digits)
Format(NOW(), "yy" )
MEMBER [Measures].[CurMonthFull] as -- Current Month (Full)
Format(NOW(),"MMMM")
MEMBER [Measures].[CurMonthNum] as -- Current Month (With 2 digits)
Format(NOW(),"MM")
MEMBER [Measures].[CurDateNum] as -- Current Date (With 2 digits)
Format(NOW(),"dd")
MEMBER [Measures].[CurDateFull] as -- Current Date
Format(NOW(),"d")
MEMBER [Measures].[CurDateFullFormat] as -- Current Date (With custom format)
Format(NOW(),"dd/MM/yyyy")
MEMBER [Measures].[PrvYear] as -- Previous Year
Format(DATEADD("yyyy",-1,NOW()),"yyyy")
MEMBER [Measures].[NxtYear] as -- Next Year
Format(DATEADD("yyyy",1,NOW()),"yyyy")
MEMBER [Measures].[PrvMonth] as -- Previous Month
Format(DATEADD("m",-1,NOW()),"MMMM")
MEMBER [Measures].[NxtMonth] as -- Next Month
Format(DATEADD("m",1,NOW()),"MMMM")
MEMBER [Measures].[PrvDate] as -- Previous Day
Format(DATEADD("d",-1,NOW()),"dd")
MEMBER [Measures].[NxtDate] as -- Next Day
Format(DATEADD("d",1,NOW()),"dd")
MEMBER [Measures].[YearDiff] as -- Difference between 2 years
DATEDIFF("yyyy",DATEADD("yyyy",-1,NOW()),DATEADD("yyyy",3,NOW()))
MEMBER [Measures].[ConvertStrToDate] as -- Convert String to Date
Cdate("1/28/2010")
select {[Measures].[CurYear],[Measures].[CurYearShot],[Measures].[CurMonthFull],[Measures].[CurMonthNum],
[Measures].[CurDateNum],[Measures].[CurDateFull],[Measures].[CurDateFullFormat],
[Measures].[PrvYear],[Measures].[NxtYear],[Measures].[PrvMonth],[Measures].[NxtMonth],
[Measures].[PrvDate],[Measures].[NxtDate], [Measures].[YearDiff],
[Measures].[ConvertStrToDate]} ON 0
FROM [Adventure Works]
เป็นประโยชน์มากๆเลยค่ะ ขอบคุณมากค่ะ
ตอบลบมีคำถามจะสอบถามหน่อยน่ะค่ะ คือว่าถ้าหาเราจา pass parameter ที่เป็น Date ใน MDX Query มีวิธีการเขียนยังไงบ้างค่ะ
ยกตัวอย่าง Query SQL ดังนี้ค่ะ
Select c_pallet_no
, d_pallet_date
From st_pallet
Where d_pallet_date between to_date(s_date,'dd/mm/yyyy')
and to_date(e_date,'dd/mm/yyyy')
ซึ่ง s_date และ e_date เป็น parameter ที่ส่งค่าเข้ามาน่ะค่ะ
ถ้าหากเขียนเป็น MDX Query ต้องเขียน syntax ประมาณไหนคะ
รบกวนด้วยนะคะ ขอบคุณล่วงหน้าค้า
ไม่แน่ใจว่าความหมายที่ต้องการคือ เหมือนกับการเขียน TSQL
ตอบลบใน SQL Server หรือป่าวนะ่ครับ เช่น Declare ตัวแปรแล้ว
Set ค่าตัวแปรตามต้องการแล้วให้ Query execute โดยรับข้อมูลจากตัวแปรที่ประกาศเข้าไป ถ้าแบบนั้น MDX ทำไม่ได้โดยตรงนะครับ
ต้องผ่านตัว Reporting service หรือใช้ OPENROWSET แทน
ถ้าใช่กรณีนี้ลองดูที่นี่ครับ
http://timlaqua.com/2008/07/dynamic-mdx-queries-in-tsql/
แต่ MDX query ค่อนข้างจะแตกต่างกับ SQL Query ปกตินะครับ
ผมไม่แน่ใจว่าคุณใช้ MDX query มานานหรือยัง เพราะมันเป็นเรื่องของ Dimension ของข้อมูล อย่างกรณีเรื่องวันที่ที่ต้องการ Filter นั้นจริง ๆ แล้วก็ต้องดูอีกว่า Dimension Date ที่ Design ในตัว Cube นั้น Designไว้อย่างไร ใช้อะไรเป็น Key ซึ่งจะเป็นตัวที่ใช้จริง ๆเวลา Query ยกตัวอย่างนะครับ จาก Adventurework
SELECT
[Measures].[Order Count] ON Columns,
[Product].[Category].MEMBERS ON Rows
FROM [Adventure Works]
WHERE
(
[Date].[Date].&[1] -- FROM Start Date (July 1 2001)
: --- BETWEEN Symbole
[Date].[Date].&[10] -- TO End Data (July 10 2001)
)
จะเป็นว่าวันที่ที่ใช้ใน Query ไม่ได้เป็นรูปแบบของวันที่จริงๆแต่เป็น ID ของ Table ที่เก็บข้อมูล Dimension วันที่น่ะครับ
นอกจากนั้นยังมีเรื่องของ Attribute ต่างๆ อีกเช่น เดือน ปี วัน(อาทิตย์ - เสาร์) ประมาณนั้นครับ
พอดีฉันเพิ่งเริ่มศึกษาเกี่ยวกับ MDX ค่ะ โดย Tool ที่ใช้จะเป็น Pentaho :Design Studio น่ะค่ะ ซึ่งตัวนี้จะเป็นตัวที่ pass parameter ส่งไปเรียกใช้งาน Cube อีกที ล่ะปัญหาที่เจอตอนนี้คือ การเขียน MDX เพื่อ pass parameter เป็นช่วงนั้น เมื่อส่งไปเรียก cube แล้ว แต่กลับมองเห็นค่าเป็น null น่ะค่ะ เลยไม่แน่ใจว่าจะต้องเขียน MDX Query ในรูปแบบไหนถึงจะถูกต้องค่ะ y_y ขอบคุณมากๆนะคะ สำหรับคำแนะนำ
ตอบลบตัวอย่างที่ลองเขียนมีดังนี้ค่ะ
with member [Date Dimension.Date].[CriteriaDate] as 'Aggregate({[Date Dimension.Date].[All Dates].[{pdate_start}]:[Date Dimension.Date].[All Dates].[{pdate_end}]})'
select NON EMPTY {[Measures].[QTY]} ON COLUMNS,
NON EMPTY {([SalesOrder Dimension.Order Hierarchy].[All Orders], [Store Dimension .Store #].[All Stores], [Time Dimension .Time Hierarchy ].[Grand Total])} ON ROWS
from [OrdersbyClient Cube]
where [Date Dimension.Date].[CriteriaDate]
---------------
จะเห็นว่า {pdate_start} และ {pdate_end} ทั้งสองค่าที่ส่งไปตอนเรียก Qube จะมีค่าเป็น null น่ะค่ะ - -''