none
Carga Tabela Fato RRS feed

  • Pergunta

  • Boa Tarde Srs,

    Gostaria de uma ajuda na carga da tabela fatos.

    Tenho o seguinte select:

    select   x.CodSKCliente
       ,x.CodSkRegiao
        ,x.CodSKProduto
        ,x.CodSKTempo
                ,count(x.QuantidadeComprado)
    from (
    select   C.CodSKCliente
       ,R.CodSkRegiao
        ,P.CodSKProduto
        ,T.CodSKTempo
        ,sum(convert(numeric(18,2),P.ValorProduto)) ValorProduto 
        ,count(C.codcliente) QuantidadeComprado
    from DBSTG_Ecommerce.dbo.TSTG_ExecucaoPrincipal TSTG
     join DimCliente C
    on tstg.codcliente=C.codcliente
     join DimProduto p
    on p.CodProduto=TSTG.codproduto
    left join DimRegiao R
    ON r.codregiao=tstg.codregiao
    left join DimTempo T
    ON convert(int,replace(convert(varchar(10),T.CodBKDia,20),'-',''))=TSTG.datacompra
    group by C.CodSKCliente
          ,R.CodSkRegiao
          ,P.CodSKProduto
          ,T.CodSKTempo
    ) x
    group by   x.CodSKCliente
            ,x.CodSkRegiao
    ,x.CodSKProduto
    ,x.CodSKTempo

    Retorno:

    CodSKCliente  CodSkRegiao  CodSKProduto  CodSKTempo  (Quantidade)
    2 2 2 12651 1
    3 2 3 12621 1
    5 4 6 11196 1
    4 3 5 11895 1
    1 1 1 11895 1
    4 3 4 11895 1
    6 5 7 11895 1
    8 6 9 12621 1

    Qual problema?

    Se perceber, a coluna QuantidadeComprado apresenta o valor 1, que na verdade seria 2 com o seguinte comando:

    select   C.CodSKCliente
       ,R.CodSkRegiao
    ,P.CodProduto
    ,T.CodSKTempo
    , sum(convert(numeric(18,2),P.ValorProduto)) ValorProduto 
    , count(C.codcliente) QuantidadeComprado
    from DBSTG_Ecommerce.dbo.TSTG_ExecucaoPrincipal TSTG
     join DimCliente C
    on tstg.codcliente=C.codcliente
     join DimProduto p
    on p.CodProduto=TSTG.codproduto
    left join DimRegiao R
    ON r.codregiao=tstg.codregiao
    left join DimTempo T
    ON convert(int,replace(convert(varchar(10),T.CodBKDia,20),'-',''))=TSTG.datacompra
    group by C.CodSKCliente
       ,R.CodSkRegiao
    ,P.CodProduto
    ,T.CodSKTempo

    retorno:

    CodSKCliente  CodSkRegiao  CodProduto  CodSKTempo  ValorProduto  QuantidadeComprado
    2 2 2 12651  11321.33 1
    5 4 5 11196  71.32 1
    8 6 8 12621  12.23 1
    3 2 3 12621   71.32 1
    1 1 1 11895  31.20 1
    6 5 6 11895  133.22 1
    4 3 4 11895  3460.56 2

    perceba que substitui o campo CodSkProduto por P.CodProduto.

    Utilizo o CodSkProduto por questão de numero sequencial, assim como os demais, mas na hora de agrupar, infelizmente ele não retorna o valor 2 como é no CodProduto,

    Alguém pode me ajudar?


    sexta-feira, 27 de junho de 2014 18:10

Respostas

  • Olá, é um pouco confuso responder sem ver a base de dados.

    O que percebi é que em sua select que compõe a tabela "x" no FROM você já usa o Count da quantidade comprada, desta forma entende que os campos lá já estão devidamente agrupados.

    Conta-los novamente na select de fora certamente retornará 1 unico registro.

    Eu tentaria o seguinte:

    select   x.CodSKCliente
       ,x.CodSkRegiao
        ,x.CodSKProduto
        ,x.CodSKTempo
                ,SUM(x.QuantidadeComprado) as QuantidadeComprado -- Troquei o Count por SUM, agora se retorna apenas 1 registro o group não está agrupando nada.
    from (
    select   C.CodSKCliente
       ,R.CodSkRegiao
        ,P.CodSKProduto
        ,T.CodSKTempo
        ,sum(convert(numeric(18,2),P.ValorProduto)) ValorProduto 
        ,count(C.codcliente) QuantidadeComprado
    from DBSTG_Ecommerce.dbo.TSTG_ExecucaoPrincipal TSTG
     join DimCliente C
    on tstg.codcliente=C.codcliente
     join DimProduto p
    on p.CodProduto=TSTG.codproduto
    left join DimRegiao R
    ON r.codregiao=tstg.codregiao
    left join DimTempo T
    ON convert(int,replace(convert(varchar(10),T.CodBKDia,20),'-',''))=TSTG.datacompra
    group by C.CodSKCliente
          ,R.CodSkRegiao
          ,P.CodSKProduto
          ,T.CodSKTempo
    ) x
    group by   x.CodSKCliente
            ,x.CodSkRegiao
    ,x.CodSKProduto
    ,x.CodSKTempo

    quarta-feira, 2 de julho de 2014 22:20

Todas as Respostas

  • Olá, é um pouco confuso responder sem ver a base de dados.

    O que percebi é que em sua select que compõe a tabela "x" no FROM você já usa o Count da quantidade comprada, desta forma entende que os campos lá já estão devidamente agrupados.

    Conta-los novamente na select de fora certamente retornará 1 unico registro.

    Eu tentaria o seguinte:

    select   x.CodSKCliente
       ,x.CodSkRegiao
        ,x.CodSKProduto
        ,x.CodSKTempo
                ,SUM(x.QuantidadeComprado) as QuantidadeComprado -- Troquei o Count por SUM, agora se retorna apenas 1 registro o group não está agrupando nada.
    from (
    select   C.CodSKCliente
       ,R.CodSkRegiao
        ,P.CodSKProduto
        ,T.CodSKTempo
        ,sum(convert(numeric(18,2),P.ValorProduto)) ValorProduto 
        ,count(C.codcliente) QuantidadeComprado
    from DBSTG_Ecommerce.dbo.TSTG_ExecucaoPrincipal TSTG
     join DimCliente C
    on tstg.codcliente=C.codcliente
     join DimProduto p
    on p.CodProduto=TSTG.codproduto
    left join DimRegiao R
    ON r.codregiao=tstg.codregiao
    left join DimTempo T
    ON convert(int,replace(convert(varchar(10),T.CodBKDia,20),'-',''))=TSTG.datacompra
    group by C.CodSKCliente
          ,R.CodSkRegiao
          ,P.CodSKProduto
          ,T.CodSKTempo
    ) x
    group by   x.CodSKCliente
            ,x.CodSkRegiao
    ,x.CodSKProduto
    ,x.CodSKTempo

    quarta-feira, 2 de julho de 2014 22:20
  • SQLSErver_Man,

    Concordo com o Ricardo, se você deseja somar então é necessário utilizar a função de agregação SUM ao invês do Count para contar.

    Por outro lado, você destacou que no Segundo Select a contagem é realizada.

    Então gostaria de entender qual é a condição que esta fazendo que ocorra a contagem em um Select e no outro a Soma!


    Pedro Antonio Galvão Junior [MVP | Microsoft Evangelist | Microsoft Partner | Engenheiro de Softwares | Especialista em Banco de Dados | SorBR.Net | Professor Universitário | MSIT.com]


    quinta-feira, 3 de julho de 2014 15:18