Usuário com melhor resposta
Junção de dados de uma mesma tabela

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?
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
-
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
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 -
-
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 '('.
-
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
-
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