none
Subtrair conjuntos de resultados no Sql 2000 RRS feed

  • Pergunta

  • select c1,
           sum(c2),
           sum(c3),
           sum(c4)
    from t1
    where ...
    group by c1

    e

    select c1,
           sum(c2),
           sum(c3),
           sum(c4)
    from t2
    where ...
    group by c1

    resultado:

    Levando em consideração que o resultado apresentado foi 2 limhas p/cada
    select.

    aaaaa 10 20 30
    bbbbb 15 25 35

    e

    aaaaa 2 3 4
    bbbbb 5 6 7

    Como efetuar a subtração do 1o. resultado pelo 2o.

     

    sexta-feira, 6 de novembro de 2009 16:00

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
    sexta-feira, 6 de novembro de 2009 16:22
    Moderador
  • 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
    sexta-feira, 6 de novembro de 2009 17:36
    Moderador
  • select c1,
           sum(c2),
           sum(c3),
           sum(c4)
    from t1
    where ...
    group by c1

    e

    select c1,
           sum(c2),
           sum(c3),
           sum(c4)
    from t2
    where ...
    group by c1

    resultado:

    Levando em consideração que o resultado apresentado foi 2 limhas p/cada
    select.

    aaaaa 10 20 30
    bbbbb 15 25 35

    e

    aaaaa 2 3 4
    bbbbb 5 6 7

    Como 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 -7

    Resultado final e esperado:

    aaaaa   8 17 26
    bbbbb 10 19 28

     

    • Marcado como Resposta Crepaldi sexta-feira, 6 de novembro de 2009 17:53
    sexta-feira, 6 de novembro de 2009 17:01

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
    sexta-feira, 6 de novembro de 2009 16:22
    Moderador
  • select c1,
           sum(c2),
           sum(c3),
           sum(c4)
    from t1
    where ...
    group by c1

    e

    select c1,
           sum(c2),
           sum(c3),
           sum(c4)
    from t2
    where ...
    group by c1

    resultado:

    Levando em consideração que o resultado apresentado foi 2 limhas p/cada
    select.

    aaaaa 10 20 30
    bbbbb 15 25 35

    e

    aaaaa 2 3 4
    bbbbb 5 6 7

    Como 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 -7

    Resultado final e esperado:

    aaaaa   8 17 26
    bbbbb 10 19 28

     

    • Marcado como Resposta Crepaldi sexta-feira, 6 de novembro de 2009 17:53
    sexta-feira, 6 de novembro de 2009 17:01
  • 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
    sexta-feira, 6 de novembro de 2009 17:36
    Moderador