Subtrair conjuntos de resultados no Sql 2000
select c1,
sum(c2),
sum(c3),
sum(c4)
from t1
where ...
group by c1e
select c1,
sum(c2),
sum(c3),
sum(c4)
from t2
where ...
group by c1resultado:
Levando em consideração que o resultado apresentado foi 2 limhas p/cada
select.aaaaa 10 20 30
bbbbb 15 25 35e
aaaaa 2 3 4
bbbbb 5 6 7Como efetuar a subtração do 1o. resultado pelo 2o.
Respostas
- Crepaldi,
Uma forma é com subqueries
declare @t1 as table (c1 char(10),c2 int, c3 int, c4 int) insert into @t1 values ('aaaaa',10,20,30) insert into @t1 values ('bbbbb',15,25,35) declare @t2 as table (c1 char(10),c2 int, c3 int, c4 int) insert into @t2 values ('aaaaa',2,3,4) insert into @t2 values ('bbbbb',5,6,7) select a.c1, a.c2-b.c2 as 'c2', a.c3-b.c3 as 'c3', a.c4-b.c4 as 'c4' FROM (select c1, sum(c2) as 'c2', sum(c3) as 'c3', sum(c4) as 'c4' from @t1 group by c1) a inner join (select c1, sum(c2) as 'c2', sum(c3) as 'c3', sum(c4) as 'c4' from @t2 group by c1) b ON a.c1 = b.c1
Segue
Att.
Marcelo Fernandes
MCP, MCDBA, MCSA, MCTS. Se útil, classifique!!!- Marcado como RespostaCrepaldi sexta-feira, 6 de novembro de 2009 17:53
- Creapaldi,
sua solução tbm é boa...
Acho que vc deveria rodar as duas solucoes em seu ambiente com muitos dados e verificar o plano de execução e statisticas.
em meus teste a solucao que indiquei foi um pouco melhor que a sua mas so tenho duas registro na tabela, recomendo vc fazer o mesmo teste em seu ambiente.
Att.
Marcelo Fernandes
MCP, MCDBA, MCSA, MCTS. Se útil, classifique!!!- Marcado como RespostaCrepaldi sexta-feira, 6 de novembro de 2009 17:52
select c1,
sum(c2),
sum(c3),
sum(c4)
from t1
where ...
group by c1e
select c1,
sum(c2),
sum(c3),
sum(c4)
from t2
where ...
group by c1resultado:
Levando em consideração que o resultado apresentado foi 2 limhas p/cada
select.aaaaa 10 20 30
bbbbb 15 25 35e
aaaaa 2 3 4
bbbbb 5 6 7Como efetuar a subtração do 1o. resultado pelo 2o.
Olá Fernandes,Eu pensei que no Sql Server existisse algum operador ou cláusula como em outros bancos.
Eu tenho uma solução parecida com a sua, mas não sei se é "elegante"
Segue abaixo minha solução, conto com sua opinião e dos demais colegas de forum.
Desde já agradeço.
select c1,
sum(c2),
sum(c3),
sum(c4)
into #teste
from t1
where ...
group by c1
UNION
select c1,
sum(c2)*-1,
sum(c3)*-1,
sum(c4)*-1
from t2
where ...
group by c1
order by c1
select c1,
c2=sum(c2),
c3=sum(c3),
c4=sum(c4)
from #teste
group by c1
resultado:Levando em consideração que o resultado apresentado foi 2 linhas p/cada
select.aaaaa 10 20 30
aaaaa -2 -3 -4
bbbbb 15 25 35
bbbbb -5 -6 -7Resultado final e esperado:
aaaaa 8 17 26
bbbbb 10 19 28- Marcado como RespostaCrepaldi sexta-feira, 6 de novembro de 2009 17:53
Todas as Respostas
- Crepaldi,
Uma forma é com subqueries
declare @t1 as table (c1 char(10),c2 int, c3 int, c4 int) insert into @t1 values ('aaaaa',10,20,30) insert into @t1 values ('bbbbb',15,25,35) declare @t2 as table (c1 char(10),c2 int, c3 int, c4 int) insert into @t2 values ('aaaaa',2,3,4) insert into @t2 values ('bbbbb',5,6,7) select a.c1, a.c2-b.c2 as 'c2', a.c3-b.c3 as 'c3', a.c4-b.c4 as 'c4' FROM (select c1, sum(c2) as 'c2', sum(c3) as 'c3', sum(c4) as 'c4' from @t1 group by c1) a inner join (select c1, sum(c2) as 'c2', sum(c3) as 'c3', sum(c4) as 'c4' from @t2 group by c1) b ON a.c1 = b.c1
Segue
Att.
Marcelo Fernandes
MCP, MCDBA, MCSA, MCTS. Se útil, classifique!!!- Marcado como RespostaCrepaldi sexta-feira, 6 de novembro de 2009 17:53
select c1,
sum(c2),
sum(c3),
sum(c4)
from t1
where ...
group by c1e
select c1,
sum(c2),
sum(c3),
sum(c4)
from t2
where ...
group by c1resultado:
Levando em consideração que o resultado apresentado foi 2 limhas p/cada
select.aaaaa 10 20 30
bbbbb 15 25 35e
aaaaa 2 3 4
bbbbb 5 6 7Como efetuar a subtração do 1o. resultado pelo 2o.
Olá Fernandes,Eu pensei que no Sql Server existisse algum operador ou cláusula como em outros bancos.
Eu tenho uma solução parecida com a sua, mas não sei se é "elegante"
Segue abaixo minha solução, conto com sua opinião e dos demais colegas de forum.
Desde já agradeço.
select c1,
sum(c2),
sum(c3),
sum(c4)
into #teste
from t1
where ...
group by c1
UNION
select c1,
sum(c2)*-1,
sum(c3)*-1,
sum(c4)*-1
from t2
where ...
group by c1
order by c1
select c1,
c2=sum(c2),
c3=sum(c3),
c4=sum(c4)
from #teste
group by c1
resultado:Levando em consideração que o resultado apresentado foi 2 linhas p/cada
select.aaaaa 10 20 30
aaaaa -2 -3 -4
bbbbb 15 25 35
bbbbb -5 -6 -7Resultado final e esperado:
aaaaa 8 17 26
bbbbb 10 19 28- Marcado como RespostaCrepaldi sexta-feira, 6 de novembro de 2009 17:53
- Creapaldi,
sua solução tbm é boa...
Acho que vc deveria rodar as duas solucoes em seu ambiente com muitos dados e verificar o plano de execução e statisticas.
em meus teste a solucao que indiquei foi um pouco melhor que a sua mas so tenho duas registro na tabela, recomendo vc fazer o mesmo teste em seu ambiente.
Att.
Marcelo Fernandes
MCP, MCDBA, MCSA, MCTS. Se útil, classifique!!!- Marcado como RespostaCrepaldi sexta-feira, 6 de novembro de 2009 17:52

