Créer une Time dimension avec SSAS (DimTime) – 2ème partie

Après la création de notre table DimTime dans la 1ère partie de cet article, nous allons maintenant apporter quelques améliorations sur notre dimension.

Par expérience, je vous recommanderais d’utiliser une clé PKDate de type int au format aaaammjj.

Ce type de clé vous permettra d’obtenir de meilleurs performances.

Cette codification au format aaaammjj devra être généralisée à tous les niveaux de notre axe temps :  année, semestre, trimestre, mois, semaine…  Je vous suggère donc que chaque niveau (année, semestre, trimestre, mois, semaine, jour) soit composé de trois attributs distincts :

  • Code
  • Date
  • Nom

Par exemple, le mois devra être composé des attributs suivants :

Attribut Type Valeur exemple Commentaire
MoisCode Int 20131101 Format aaaammjj, par défaut doit toujours se référer à la 1ère date de la période
MoisDate SmallDateTime 2009311­01 00:00:00 Format date
MoisName Varchar(50) Novembre 2013 Valeur au format affichée

Les valeurs des attributs Code devront être déduites à partir des valeurs attributs Date, à l’aide d’un script SQL de mise à jour (requête UPDATE).  Afin de finaliser l’axe temps, je vous conseille d’exécuter le script suivant :

USE [SSASTime]

-- Suppression de la clé primaire
ALTER TABLE [dbo].[DimTime] DROP CONSTRAINT [PKDimTime]
GO

-- Renommage des colonnes
EXEC sp_rename N'[dbo].[DimTime].[PKDate]', N'Date', 'COLUMN'
GO
EXEC sp_rename N'[dbo].[DimTime].[DateName]', N'Day', 'COLUMN'
GO
EXEC sp_rename N'[dbo].[DimTime].[Year]', N'YearDate', 'COLUMN'
GO
EXEC sp_rename N'[dbo].[DimTime].[HalfYear]', N'HalfYearDate', 'COLUMN'
GO
EXEC sp_rename N'[dbo].[DimTime].[Quarter]', N'QuarterDate', 'COLUMN'
GO
EXEC sp_rename N'[dbo].[DimTime].[Month]', N'MonthDate', 'COLUMN'
GO
EXEC sp_rename N'[dbo].[DimTime].[Week]', N'WeekDate', 'COLUMN'
GO

-- Modification des types de données DateTime en SmallDateTime
ALTER TABLE [dbo].[DimTime] ALTER COLUMN [Date] [smalldatetime] NOT NULL
ALTER TABLE [dbo].[DimTime] ALTER COLUMN [YearDate] [smalldatetime] NOT NULL
ALTER TABLE [dbo].[DimTime] ALTER COLUMN [HalfYearDate] [smalldatetime] NOT NULL
ALTER TABLE [dbo].[DimTime] ALTER COLUMN [QuarterDate] [smalldatetime] NOT NULL
ALTER TABLE [dbo].[DimTime] ALTER COLUMN [MonthDate] [smalldatetime] NOT NULL
ALTER TABLE [dbo].[DimTime] ALTER COLUMN [WeekDate] [smalldatetime] NOT NULL
GO

-- Modification des types de données nvarchar en varchar
ALTER TABLE [dbo].[DimTime] ALTER COLUMN [Day] [varchar] (50) COLLATE SQL_Latin1_General_CP1_CI_AS NULL
ALTER TABLE [dbo].[DimTime] ALTER COLUMN [YearName] [varchar] (50) COLLATE SQL_Latin1_General_CP1_CI_AS NULL
ALTER TABLE [dbo].[DimTime] ALTER COLUMN [HalfYearName] [varchar] (50) COLLATE SQL_Latin1_General_CP1_CI_AS NULL
ALTER TABLE [dbo].[DimTime] ALTER COLUMN [QuarterName] [varchar] (50) COLLATE SQL_Latin1_General_CP1_CI_AS NULL
ALTER TABLE [dbo].[DimTime] ALTER COLUMN [MonthName] [varchar] (50) COLLATE SQL_Latin1_General_CP1_CI_AS NULL
ALTER TABLE [dbo].[DimTime] ALTER COLUMN [WeekName] [varchar] (50) COLLATE SQL_Latin1_General_CP1_CI_AS NULL
GO

-- Création des colonnes de type _Code
ALTER TABLE [dbo].[DimTime] ADD [Time_PK] [int] NULL
ALTER TABLE [dbo].[DimTime] ADD [YearCode] [int] NULL
ALTER TABLE [dbo].[DimTime] ADD [HalfYearCode] [int] NULL
ALTER TABLE [dbo].[DimTime] ADD [QuarterCode] [int] NULL
ALTER TABLE [dbo].[DimTime] ADD [MonthCode] [int] NULL
ALTER TABLE [dbo].[DimTime] ADD [WeekCode] [int] NULL
GO

-- Remplir Time_PK
UPDATE [dbo].[DimTime]
   SET [Time_PK] =
   (
   CAST(YEAR([Date]) AS varchar(50))
   +
   (
        CASE WHEN MONTH([Date])<10
                THEN '0' + CAST(MONTH([Date]) AS varchar(50))
                ELSE CAST(MONTH([Date]) AS varchar(50))
        END
        )
        +
        CASE WHEN DAY([Date])<10
                THEN '0' + CAST(DAY([Date]) AS varchar(50))
                ELSE CAST(DAY([Date]) AS varchar(50))
        END
        )

-- Remplir YearCode
UPDATE [dbo].[DimTime]
   SET [YearCode] =
   (
   CAST(YEAR([YearDate]) AS varchar(50))
   +
   (
        CASE WHEN MONTH([YearDate])<10
                THEN '0' + CAST(MONTH([YearDate]) AS varchar(50))
                ELSE CAST(MONTH([YearDate]) AS varchar(50))
        END
        )
        +
        CASE WHEN DAY([YearDate])<10
                THEN '0' + CAST(DAY([YearDate]) AS varchar(50))
                ELSE CAST(DAY([YearDate]) AS varchar(50))
        END
        )

-- Remplir HalfYearCode
UPDATE [dbo].[DimTime]
   SET [HalfYearCode] =
   (
   CAST(YEAR([HalfYearDate]) AS varchar(50))
   +
   (
        CASE WHEN MONTH([HalfYearDate])<10
                THEN '0' + CAST(MONTH([HalfYearDate]) AS varchar(50))
                ELSE CAST(MONTH([HalfYearDate]) AS varchar(50))
        END
        )
        +
        CASE WHEN DAY([HalfYearDate])<10
                THEN '0' + CAST(DAY([HalfYearDate]) AS varchar(50))
                ELSE CAST(DAY([HalfYearDate]) AS varchar(50))
        END
        )

-- Remplir QuarterCode
UPDATE [dbo].[DimTime]
   SET [QuarterCode] =
   (
   CAST(YEAR([QuarterDate]) AS varchar(50))
   +
   (
        CASE WHEN MONTH([QuarterDate])<10
                THEN '0' + CAST(MONTH([QuarterDate]) AS varchar(50))
                ELSE CAST(MONTH([QuarterDate]) AS varchar(50))
        END
        )
        +
        CASE WHEN DAY([QuarterDate])<10
                THEN '0' + CAST(DAY([QuarterDate]) AS varchar(50))
                ELSE CAST(DAY([QuarterDate]) AS varchar(50))
        END
        )

-- Remplir MonthCode
UPDATE [dbo].[DimTime]
   SET [MonthCode] =
   (
   CAST(YEAR([MonthDate]) AS varchar(50))
   +
   (
        CASE WHEN MONTH([MonthDate])<10
                THEN '0' + CAST(MONTH([MonthDate]) AS varchar(50))
                ELSE CAST(MONTH([MonthDate]) AS varchar(50))
        END
       )
        +
        CASE WHEN DAY([MonthDate])<10
                THEN '0' + CAST(DAY([MonthDate]) AS varchar(50))
                ELSE CAST(DAY([MonthDate]) AS varchar(50))
        END
        )

-- Remplir WeekCode
UPDATE [dbo].[DimTime]
   SET [WeekCode] =
   (
   CAST(YEAR([WeekDate]) AS varchar(50))
   +
   (
        CASE WHEN MONTH([WeekDate])<10
                THEN '0' + CAST(MONTH([WeekDate]) AS varchar(50))
                ELSE CAST(MONTH([WeekDate]) AS varchar(50))
        END
        )
        +
        CASE WHEN DAY([WeekDate])<10
                THEN '0' + CAST(DAY([WeekDate]) AS varchar(50))
                ELSE CAST(DAY([WeekDate]) AS varchar(50))
        END
        )      

-- modifier les colonnes pour interdire la valeur null
ALTER TABLE [dbo].[DimTime] ALTER COLUMN [Time_PK] [int] NOT NULL
ALTER TABLE [dbo].[DimTime] ALTER COLUMN [Day] [varchar] (50) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL
ALTER TABLE [dbo].[DimTime] ALTER COLUMN [YearCode] [int] NOT NULL
ALTER TABLE [dbo].[DimTime] ALTER COLUMN [YearName] [varchar] (50) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL
ALTER TABLE [dbo].[DimTime] ALTER COLUMN [QuarterCode] [int] NOT NULL
ALTER TABLE [dbo].[DimTime] ALTER COLUMN [QuarterName] [varchar] (50) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL
ALTER TABLE [dbo].[DimTime] ALTER COLUMN [HalfYearCode] [int] NOT NULL
ALTER TABLE [dbo].[DimTime] ALTER COLUMN [HalfYearName] [varchar] (50) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL
ALTER TABLE [dbo].[DimTime] ALTER COLUMN [MonthCode] [int] NOT NULL
ALTER TABLE [dbo].[DimTime] ALTER COLUMN [MonthName] [varchar] (50) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL
ALTER TABLE [dbo].[DimTime] ALTER COLUMN [WeekCode] [int] NOT NULL
ALTER TABLE [dbo].[DimTime] ALTER COLUMN [WeekName] [varchar] (50) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL
GO

-- Positionner la cle primaire sur Time_PK

ALTER TABLE [dbo].[DimTime] ADD CONSTRAINT [PK_DimTime] PRIMARY KEY CLUSTERED  ([Time_PK])
GO

 

Ce script réalise les opérations suivantes :

  • Il renomme un certain nombre de colonnes.
  • Il modifie des types de données DateTime en SmallDateTime.
  • Il modifie des types de données nvarchar en varchar.
  • Il crée la clé Temps_PK ainsi que les colonnes AnneeCode,  SemestreCode,  TrimestreCode,  MoisCode  et  SemaineCode.
  • Il remplit les valeurs pour les champs créés précédemment.
  • Il modifie les colonnes pour interdire la valeur null.
  • Il repositionne la clé primaire sur Temps_PK.

Au final, après exécution du script, la table DimTime devra avoir ce formalisme :

13

Le champ Time_PK devra bien entendu être une clé primaire.  En revanche, exceptionnellement, n’activez pas l’incrémentation automatique pour cette table.

  • Vérifiez que la table DimTime est bien remplie :

12

En effet, la table DimTime, nous venons de créer, est parfaitement standard et réutilisable, quels que soient vos futurs projets d’entrepôt de données.

 

Leave a comment

Leave a Reply

Your email address will not be published. Required fields are marked *

This site uses Akismet to reduce spam. Learn how your comment data is processed.