none
Crir Named Query (DSV) para Datas!? [solucionado] RRS feed

  • Pergunta

  • Boa tarde!

    Tenho 01 mês de experiência em OLAP, Cubos, SQL.. não sei se estou exigindo demais.. mas preciso criar uma Dimensão de datas personalizada para que fique melhor para análise, com este comando abaixo seleciono uma banda de Datas do banco de dados relacionado, mas ele retorna a data em formato SQL, queria se possível gerar a tabela virtual (Named Query) com ANO e MES, talvez DIAS.. existe esta possibilidade...

    SELECT En.DatRefr
    FROM EventosNew En, ContasEv Ce, ProcedEv Pe, Prestador Pd, Conveniada Cn
    WHERE En.NumEvento = Ce.NumEvento
    AND Ce.NumEvento = Pe.NumEvento
    AND Ce.NumConta = Pe.NumConta
    AND En.PreEvento = Pd.CGCCPFPre
    AND En.CodCon = Cn.CodCon
    AND En.DatRefr >= '2008/01/01'
    ORDER BY En.DatRefr

    esta consulta retorna:

    2008-01-01 00:00:00.000
    2008-01-01 00:00:00.000
    2008-01-01 00:00:00.000
    2008-02-01 00:00:00.000
    2008-02-01 00:00:00.000
    2008-02-01 00:00:00.000
    2008-02-01 00:00:00.000
    2008-02-01 00:00:00.000
    ................

    queria gerar a tabela tipo assim: (uma vez que criei uma named query virtual para a tabela de fatos puxando das 03 tabelas principais e rodou blza)...

    ANO | MES | DIA
    ............




    Obrigado,
    Rafael


    quinta-feira, 21 de agosto de 2008 18:10

Todas as Respostas

  • Ae Rafael,

    não tenho certeza se entendi seu problema. Tipo, você esta querendo criar essa tabela pra usá-la como uma dimensão?? caso seja para isso você pode simplesmente pegar esse DatRefr e fazer algo como o código abaixo, por exemplo:

    insert into dbo.DimData (Data, Ano,  Semestre, Trimestre, Mes, DiaDoMes)
    select distinct
    En.DatRefr ,
    DATEPART(year, En.DatRefr ) as Ano,
    CASE
     WHEN DATEPART(mm,
    En.DatRefr ) <=6 THEN 1
     ELSE 2
    END AS Semestre,
    DATEPART(qq,
    En.DatRefr ) as Trimestre,
    DATEPART(mm,
    En.DatRefr ) as Mes,
    DATEPART(d,
    En.DatRefr ) as DiaDoMes
    from <tabela>
    -- para não colocar datas repetidas
    where not exists (select dt.Data
                   from dbo.DimData dt
                                where dt.data =
    En.DatRefr )

    Mas se mesmo assim você tiver querendo utilizar named query, acredito que o código acima também sirva, modificando apenas algumas coisinhas, como tirar o 'insert', por exemplo.


    atenciosamente,
    sexta-feira, 22 de agosto de 2008 15:08
  • Ok, muito obrigado.. pouco antes de você me responder consegui uma solução aqui com muita pesquisa e tentativas... mas estou guardando este código também, interesante.. de qualquer forma segue o codigo que eu usei aqui que pode servir para outros usuários ao pesquisar... a Dimensão foi criada ficou blza


    Vlw


    Code Snippet

    -- RETORNA DIA MES E ANO DATA EM FORMATO 1 1 2008

    SELECT
    DAY(En.DatRefr) As [DIA],
    MONTH(En.DatRefr) As [MÊS],
    YEAR(En.DatRefr) As [ANO]
    FROM EventosNew En
    where En.DatRefr >= '2008/06/01'



    --==================================================================================================

    -- RETORNA O MES EM FORMA DE NOME AO INVÉS DE NÚMERO

    DECLARE @PegaMes As datetime;
    SET @PegaMes = (SELECT MONTH(GETDATE()))
    SELECT CASE --CASO MES = 0 a 12 retorna o nome do mês...
                WHEN @PegaMes = 1 THEN
                'JANEIRO'
            WHEN @PegaMes = 2 THEN
                'FEVEREIRO'
                WHEN @PegaMes = 3 THEN
                'MARÇO'
                WHEN @PegaMes = 4 THEN
                'ABRIL'
                WHEN @PegaMes = 5 THEN
                'MAIO'
                WHEN @PegaMes = 6 THEN
                'JUNHO'
                WHEN @PegaMes = 7 THEN
                'JULHO'
                WHEN @PegaMes = 8 THEN
                'AGOSTO'
                WHEN @PegaMes = 9 THEN
                'SETEMBRO'
                WHEN @PegaMes = 10 THEN
                'OUTUBRO'
                WHEN @PegaMes = 11 THEN
                'NOVEMBRO'
                WHEN @PegaMes = 12 THEN
                'DEZEMBRO'
                END As [MÊS] --ALIAS DA COLUNA



    --==================================================================================================


    -- CRIA UMA FUNÇÃO DE NOME "dbo.NomeMes_fn" E GRAVA NO BANCO DE DADOS PARA TRANSFORMAR O MES NUMERO EM NOME


    CREATE FUNCTION dbo.NomeMes_fn
          (
          @Mes INT
          )
    RETURNS CHAR(10)
    AS
          BEGIN
    DECLARE @NomeMes CHAR(10)
          IF (@mes = 1)
                SET @NomeMes = 'JANEIRO'
          ELSE IF (@mes = 2)
                SET @NomeMes = 'FEVEREIRO'
          ELSE IF (@mes = 3)
                SET @NomeMes = 'MARÇO'
          ELSE IF (@mes = 4)
                SET @NomeMes = 'ABRIL'
          ELSE IF (@mes = 5)
                SET @NomeMes = 'MAIO'
          ELSE IF (@mes = 6)
                SET @NomeMes = 'JUNHO'
          ELSE IF (@mes = 7)
                SET @NomeMes = 'JULHO'
          ELSE IF (@mes = 8)
                SET @NomeMes = 'AGOSTO'
          ELSE IF (@mes = 9)
                SET @NomeMes = 'SETEMBRO'
          ELSE IF (@mes = 10)
                SET @NomeMes = 'OUTUBRO'
          ELSE IF (@mes = 11)
                SET @NomeMes = 'NOVEMBRO'
          ELSE IF (@mes = 12)
                SET @NomeMes = 'DEZEMBRO'

          RETURN @NomeMes
          END


    --==================================================================================================


    -- EXECUTA UM COMANDO CHAMANDO A FUNÇÃO QUE TRANSFORMA A DATA SQL AUTOMATICAMENTE

    SELECT
    YEAR(En.DatRefr) As [ANO],
    dbo.NomeMes_fn(MONTH(En.DatRefr)) As [MÊS],
    DAY(En.DatRefr) As [DIA]

    FROM EventosNew En
    where En.DatRefr >= '2008/01/01'
    ORDER BY En.DatRefr





    sexta-feira, 22 de agosto de 2008 16:57
  • E ae Rafael,
    bacana cara. Já que já está solucionado, então bota a thread como Respondida.

    vlw Abraço
    segunda-feira, 25 de agosto de 2008 19:44