SQL Server Indonesia User Groups Community October 2009 - Posts - Cahyo drop in {here}

SQL Server Indonesia User Groups Community

SQL Server Indonesia User Groups Community
Welcome to SQL Server Indonesia User Groups Community Sign in | Join | Help
in Search

Cahyo drop in {here}

SQL as breakfast, BI for lunch and dinner with MDX

October 2009 - Posts

  • MDX - SSRS - Time Dimension Parameter Desc Order

    Saat sedang membuat sebuah report menggunakan SSRS 2008 saya menemukan sebuah kasus dimana saya perlu membuat parameter dimensi waktu diurutkan secara descending. Parameter disini menggunakan dataset dari cube sehingga querynya menggunakan MDX. By default ketika kita membuat dataset menggunakan cube(SSAS) query untuk parameter akan digenerate secara otomatis. Berikut adalah query hasil generate otomatis untuk parameter bulan:

    WITH
    MEMBER [Measures].[ParameterCaption] AS [Time].[Month Prod].CURRENTMEMBER.MEMBER_CAPTION
    MEMBER [Measures].[ParameterValue] AS [Time].[Month Prod].CURRENTMEMBER.UNIQUENAME
    MEMBER [Measures].[ParameterLevel] AS [Time].[Month Prod].CURRENTMEMBER.LEVEL.ORDINAL
    SELECT
    {[Measures].[ParameterCaption], [Measures].[ParameterValue], [Measures].[ParameterLevel]} ON COLUMNS ,
    [Time].[Month Prod].ALLMEMBERS ON ROWS
    FROM [Comp Cube]

    Seperti yang dapat anda baca dari query diatas, saya mengambil data dari atribut [Month Prod] dari dimensi [Time]. Hasil query ini diurutkan secara ascending menggunakan composite key dari atribut [Month Prod] yaitu tahun dan bulan. Contoh dari uniquename dari membernya [Month Prod] adalah [Time].[Month Prod].&[2009]&[10]. Untuk menghasilkan hasil dari query tersebut diurutkan secara descending, anda bisa menggunakan query seperti berikut:

    WITH
    MEMBER [Measures].[ParameterCaption] AS [Time].[Month Prod].CURRENTMEMBER.MEMBER_CAPTION
    MEMBER [Measures].[ParameterValue] AS [Time].[Month Prod].CURRENTMEMBER.UNIQUENAME
    MEMBER [Measures].[ParameterLevel] AS [Time].[Month Prod].CURRENTMEMBER.LEVEL.ORDINAL
    MEMBER [Measures].[DateOrder] as
    [Time].[Month Prod].CurrentMember.Properties("Key0") + vba!right("0" +
    [Time].[Month Prod].CurrentMember.Properties("Key1") ,2)
    SELECT
    {[Measures].[ParameterCaption], [Measures].[ParameterValue], [Measures].[ParameterLevel]} ON COLUMNS ,
    ORDER([Time].[Month Prod].[All].Children ,[Measures].[DateOrder],bdesc)
    ON ROWS
    FROM [Comp Cube]

    Pada query diatas saya membuat calculated measure bernama [DateOrder] yang menggabungkan key tahun dan bulan yang bisa diakses menggunakan properties key0 dan key1. Setelah itu dengan menggunakan fungsi ORDER kita bisa mengurutkan hasil dari query untuk mendapatkan bulan dengan menggunakan measure [DateOrder] sebagai kriteria untuk dasar pengurutannya.

  • DW - DimTime for Production Calendar Hierarchy 4-4-5

    Di suatu project BI yang saya kerjakan ada permintaan dari klien agar dimensi waktu yang dibuat nantinya punya hierarchy dengan format kalendar 4-4-5.Kalender 4-4-5 disini berarti dalam satu bulan ada 4-5 minggu. Kala u kita melihat kalender yg sebenarnya, akan ada 1 minggu yang terletak di antara 2 bulan. Pada contoh kasus kali ini, hari jumat adalah hari pertama dalam 1 minggu produksi. Untuk lebih jelas ilustrasinya seperti di bawah ini:

    • 1 Okt 2009 adalah Minggu ke-4 bulan Sept
    • 2 Okt 2009-8 Okt 2009 adalah Minggu ke-1 bulan Okt
    • 9 Okt 2009-15 Okt 2009 adalah Minggu ke-2 bulan Okt
    • 16 Okt 2009-22 Okt 2009 adalah Minggu ke-3 bulan Okt
    • 23 Okt 2009-30 Okt 2009 adalah Minggu ke-4 bulan Okt
    • 31 Okt 2009-6 Nov 2009 adalah Minggu ke-5 bulan Okt

    Untuk Mendapatkan Minggu tersebut saya menggunakan hari pertama pada suatu minggu sebagai acuan. Sesuai permintaan, hari pertama suatu minggu disini adalah hari jumat bukan hari minggu. Untuk lebih jelasnya sintaks pembuatan tabel dimensi waktu ini adalah sbb:

     CREATE TABLE DimTime (
        TimeKey int IDENTITY PRIMARY KEY,
        AlternateKey AS year(TheDate)*10000+month(TheDate)*100+day(TheDate),
        TheDate datetime NOT NULL,
        Year AS datepart(year,TheDate),
        Quarter AS datepart(quarter,TheDate),
        QuarterName AS 'Q'+datename(quarter,TheDate)+' '+datename(year,TheDate),
        Month AS datepart(month,TheDate),
        MonthName AS LEFT(datename(month,TheDate),3)+' '+datename(year,TheDate),
        Week AS datepart(week,TheDate),
        WeekName AS 'Week '+datename(week,TheDate)+' '+datename(year,TheDate),
        DateName AS datename(day,TheDate)+' '+LEFT(datename(month,TheDate),3)+' '+datename(year,TheDate),
        WeekDayProd AS datepart(dw,dateadd(day,-5,TheDate)),
        FirstWeekDayProd AS dateadd(day,1-datepart(dw,dateadd(day,-5,TheDate)),Thedate),
        YearProd AS datepart(year,dateadd(day,1-datepart(dw,dateadd(day,-5,TheDate)),Thedate)),
        QuarterProd AS datepart(quarter,dateadd(day,1-datepart(dw,dateadd(day,-5,TheDate)),Thedate)),
        QuarterProdName AS 'Q'+datename(quarter,dateadd(day,1-datepart(dw,dateadd(day,-5,TheDate)),Thedate))+' '+datename(year,dateadd(day,1-datepart(dw,dateadd(day,-5,TheDate)),Thedate)),
        MonthProd AS datepart(month,dateadd(day,1-datepart(dw,dateadd(day,-5,TheDate)),Thedate)),
        MonthProdName AS LEFT(datename(month,dateadd(day,1-datepart(dw,dateadd(day,-5,TheDate)),Thedate)),3)+' '+datename(year,dateadd(day,1-datepart(dw,dateadd(day,-5,TheDate)),Thedate)),
        WeekProd AS (DATEPART(day,dateadd(day,1-datepart(dw,dateadd(day,-5,TheDate)),Thedate))-1)/7+1,
        WeekProdName AS 'Week '+cast((DATEPART(day,dateadd(day,1-datepart(dw,dateadd(day,-5,TheDate)),Thedate))-1)/7+1 AS char(1))+' '+LEFT(datename(month,dateadd(day,1-datepart(dw,dateadd(day,-5,TheDate)),Thedate)),3)+' '+datename(year,dateadd(day,1-datepart(dw,dateadd(day,-5,TheDate)),Thedate))
    )

      Untuk mencoba mengisi data dan melihat hasil pada DimTime ini anda bisa gunakan script berikut:

    DECLARE @startdate datetime,@enddate datetime
    SET @startdate='20090801'
    SET @enddate='20090930'

    TRUNCATE TABLE DimTime
    WHILE (@startdate<=@enddate)
    BEGIN
        INSERT INTO DimTime VALUES(@startdate)
        SET @startdate=dateadd(day,1,@startdate)
    END

    SELECT * FROM DimTime t

    Saya sudah membuat contoh production calendar hierachy pada SSAS menggunakan DimTime ini. Hierarchynya urut dari tahun-kuarter-bulan-minggu-tanggal. Screenshotnya seperti gambar di bawah:

    Production Calendar Hierarchy 

    Kalau kita perhatikan tanda berwarna merah pada gambar di atas adalah tanggal pada bulan september yang dimasukan ke minggu di bulan agustus untuk keperluan kalender produksi ini.

More Posts
Powered by Community Server (Commercial Edition), by Telligent Systems