Usuário com melhor resposta
Subtrair conjuntos de resultados no Sql 2000

Pergunta
-
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 Resposta Crepaldi 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 Resposta Crepaldi 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 Resposta Crepaldi 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 Resposta Crepaldi 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 Resposta Crepaldi 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 Resposta Crepaldi sexta-feira, 6 de novembro de 2009 17:52