none
Junção de dados de uma mesma tabela RRS feed

  • Pergunta

  • Pessoal, saudações.

    Perdoem a minha ignorância em pedir uma ajuda dessas para vocês, mas nõo consegui mesmo desenvolver uma linha de raciocínio que me leve a um resultado final.

    O minha questão é a seguinte, tenho uma tabela no meu sistema que está com todas as informações do contas a receber e essa tabela é geralzona, ou seja, pega informações de 01/01/2010 a 31/12/2010 (exemplo). Quero pegar a soma dos valores de cada mês e colocar em colunas diferentes, exemplo, somar o valor de JAN e colocar em uma coluna com o nome JAN e assim sucessivamente.

    Somar os valores não tem segredo, o que estou quebrando minha cabeça aqui é como vou fazer para gerar cada coluna com os valores dos respectivos meses uma vez que a tabela é uma só!

    Deu para entender?

    sábado, 16 de outubro de 2010 17:34

Respostas

  • Amigo,

    segue um exemplo para vc ver se esta batendo com o seu:

    create table #vendas(Id int primary key identity(1,1), Data datetime not null, Valor float)
    go
    insert #vendas values('2010-01-01',100)
    insert #vendas values('2010-02-01',101)
    insert #vendas values('2010-03-01',102)
    insert #vendas values('2010-04-01',105)
    go
    select 'Mês',
    [1] as Jan,
    [2] as Fev,
    [3] as Mar,
    [4] as Abr
    from (select Valor,MONTH(data)Mes from #vendas) as Valores
    PIVOT(SUM(valor) FOR Mes IN ([1],[2],[3],[4])) as PivotTable; 
    

    Olavo Oliveira Neto
    Se for útil marque como resposta e faça um Developer feliz :)
    • Marcado como Resposta Eder Costa terça-feira, 14 de dezembro de 2010 18:53
    segunda-feira, 18 de outubro de 2010 13:49
  • Olavo, saudações.

    O meu estava um pouco diferente, mas já resolvi aqui de uma forma um pouco igual a essa, mas usando critérios de como seria feito no SQL 2000 sem a função PIVOT TABLE. Da forma que adoteir aqui resolveu bacana meu problema e com um detalhe tenho flexibilidade na query.

    Obrigado pela ajuda e atenção, segue abaixo a query para quem precise.

    select

     

    SUBSTRING(E1_EMISSAO,1,4) as ANO

     

    , JAN = sum(case when SUBSTRING(E1_EMISSAO,5,2)='01' then E1_VALOR end)

     

    , FEV = sum(case when SUBSTRING(E1_EMISSAO,5,2)='02' then E1_VALOR end)

     

    , MAR = sum(case when SUBSTRING(E1_EMISSAO,5,2)='03' then E1_VALOR end)

     

    , ABR = sum(case when SUBSTRING(E1_EMISSAO,5,2)='04' then E1_VALOR end)

     

    , MAI = sum(case when SUBSTRING(E1_EMISSAO,5,2)='05' then E1_VALOR end)

     

    , JUN = sum(case when SUBSTRING(E1_EMISSAO,5,2)='06' then E1_VALOR end)

     

    , JUL = sum(case when SUBSTRING(E1_EMISSAO,5,2)='07' then E1_VALOR end)

    from

     

    SE1010

    where

     

    D_E_L_E_T_ <> '*'

     

    and SUBSTRING(E1_EMISSAO,1,4)>='2008'

    group

     

    by SUBSTRING(E1_EMISSAO,1,4)

    order

     

    by SUBSTRING(E1_EMISSAO,1,4)

    • Marcado como Resposta Eder Costa terça-feira, 14 de dezembro de 2010 18:53
    terça-feira, 19 de outubro de 2010 13:10

Todas as Respostas

  • Gustavo,

    Qual a versão de seu SQL, se for 2005 ou superior podemos usar o PIVOT TABLE

    Att.
    Marcelo Fernandes


    Não Perca o Worldwide Online TechDay 2010

    Um evento gratuito com grandes personalidades (Buck Woody, Chad Miller, Steve Jones, Fabricio Catae e muito mais...

    Eu vou falar sobre particionamento de tabelas registre-se

    Acesse o site do evento http://www.online.techday.net.br

    MCP, MCDBA, MCSA, MCTS.
    Se útil, classifique!!!
    Me siga no twitter: @marcelodba

    sábado, 16 de outubro de 2010 17:45
    Moderador
  • Marcelo, saudações.

    Desculpe não ter informado aqui, estou usando o 2005 SP3.

    segunda-feira, 18 de outubro de 2010 11:09
  • Pessoas, usando o PIVOT TABLE montei a seguinte query

    Select

    <code> 

    SUBSTRING(E1_EMISSAO,1,4) as ANO

    , [1] as Jan

     

    , [2] as Fev

     

    , [3] as Mar

     

    , [4] as Abr

    from

     

    SE1010

    pivot

     

    (sum(E1_VALOR) for SUBSTRING(E1_EMISSAO,5,2) in ([1],[2],[3],[4]))

    PivotTable

    order

     

    by 1

     </code>

    Porém ela está me retornando um erro. Já chequei os parenteses e está tudo certo (teoricamente). Segue a mensagem

    Msg 102, Level 15, State 1, Line 7

    Incorrect syntax near '('.

     

      

     

     

     

     

    segunda-feira, 18 de outubro de 2010 12:00
  • Amigo,

    segue um exemplo para vc ver se esta batendo com o seu:

    create table #vendas(Id int primary key identity(1,1), Data datetime not null, Valor float)
    go
    insert #vendas values('2010-01-01',100)
    insert #vendas values('2010-02-01',101)
    insert #vendas values('2010-03-01',102)
    insert #vendas values('2010-04-01',105)
    go
    select 'Mês',
    [1] as Jan,
    [2] as Fev,
    [3] as Mar,
    [4] as Abr
    from (select Valor,MONTH(data)Mes from #vendas) as Valores
    PIVOT(SUM(valor) FOR Mes IN ([1],[2],[3],[4])) as PivotTable; 
    

    Olavo Oliveira Neto
    Se for útil marque como resposta e faça um Developer feliz :)
    • Marcado como Resposta Eder Costa terça-feira, 14 de dezembro de 2010 18:53
    segunda-feira, 18 de outubro de 2010 13:49
  • Olavo, saudações.

    O meu estava um pouco diferente, mas já resolvi aqui de uma forma um pouco igual a essa, mas usando critérios de como seria feito no SQL 2000 sem a função PIVOT TABLE. Da forma que adoteir aqui resolveu bacana meu problema e com um detalhe tenho flexibilidade na query.

    Obrigado pela ajuda e atenção, segue abaixo a query para quem precise.

    select

     

    SUBSTRING(E1_EMISSAO,1,4) as ANO

     

    , JAN = sum(case when SUBSTRING(E1_EMISSAO,5,2)='01' then E1_VALOR end)

     

    , FEV = sum(case when SUBSTRING(E1_EMISSAO,5,2)='02' then E1_VALOR end)

     

    , MAR = sum(case when SUBSTRING(E1_EMISSAO,5,2)='03' then E1_VALOR end)

     

    , ABR = sum(case when SUBSTRING(E1_EMISSAO,5,2)='04' then E1_VALOR end)

     

    , MAI = sum(case when SUBSTRING(E1_EMISSAO,5,2)='05' then E1_VALOR end)

     

    , JUN = sum(case when SUBSTRING(E1_EMISSAO,5,2)='06' then E1_VALOR end)

     

    , JUL = sum(case when SUBSTRING(E1_EMISSAO,5,2)='07' then E1_VALOR end)

    from

     

    SE1010

    where

     

    D_E_L_E_T_ <> '*'

     

    and SUBSTRING(E1_EMISSAO,1,4)>='2008'

    group

     

    by SUBSTRING(E1_EMISSAO,1,4)

    order

     

    by SUBSTRING(E1_EMISSAO,1,4)

    • Marcado como Resposta Eder Costa terça-feira, 14 de dezembro de 2010 18:53
    terça-feira, 19 de outubro de 2010 13:10