Array
(
)

Como pegar registros repetidos de uma tabela e transferir para tabela B em um unico registro somando os campos valores

Silvianysa
   - 08 jun 2011

Olá Pessoal,   Sou iniciante no Sql   e estou precisando de uma ajuda para entregar uma tarefa no SQL.  

Preciso fazer um IF da seguinte forma:

 

Estou criando uma procedure da seguinte forma:

insert into NOVA_TABELA (tabela de destino)(ACCT_CD,EXT_SEC_ID,LONG_SHT_CD,QTY_SOD,MKT_VAL_SOD,PLEDGED_QTY)

Select
ISIN,
case [Classe Operação]
when'C' then 'L'
when'V then 'S'
when'T' then 'L'
when'D' then 'L
end'[classe operação]
([Qtde. Disponível] +[Qtde. Garantia]) AS TOTAL,
([Valor Find. Isp.] + [Valor Finem. Gar]) AS TOTAL2,
[Qtde. Garantia]

FROM XML_Acoes(tabela de Origem)

Só que agora preciso colocar aquela validação descrita a abaixo:

Se o ID_fundo for igual o campo ISIN, deverá incluir na Tabela de destino apenas um registro somando os campos valores, exemplo:

Forma que esta na tabela XML(Origem)

Id_fundo ISIN LONG_SHT_CD QTY_SOD MKT_VAL_SOD PLEDGED_QTY
------------ ------ ------- ------------- ---------- --------- ----- --------------- -----
Inst AMAR3 L 100 100 0
Inst AMAR3 L 50 50 50
Tarp AMAR6 L 400 800 400

Deverá inserir na Tabela NOVA(Destino) assim:

Inst AMAR3 L 150 150 50
Tarp AMAR6 L 400 800 0 

Não sei se o IF é o mas viável....mesmo...

  Aguardo retorno...   Agradeço desde já pela atenção. SAS  

Rafmattos
   - 08 jun 2011

vc tem que utilizar funções de agração no caso o sum que é de soma

#Código

select id_fundo, isin, long_sht_cd, sum(qty_sod), sum(mkt_val_sod), sum(pledged_qty) from TABELA
group by id_fundo, isin, long_sht_cd

Silvianysa
   - 08 jun 2011

Olá Rafael,   Não deu certo. Deixa ser mas clara na questão:   Estou criando uma procedure da seguinte forma Insert/Select:

insert into NOVA_TABELA (tabela de destino)(ACCT_CD,EXT_SEC_ID,LONG_SHT_CD,QTY_SOD,MKT_VAL_SOD,PLEDGED_QTY)

Select
ISIN,
case [Classe Operação]
when'C' then 'L'
when'V then 'S'
when'T' then 'L'
when'D' then 'L
end'[classe operação]
([Qtde. Disponível] +[Qtde. Garantia]) AS TOTAL,
([Valor Find. Isp.] + [Valor Finem. Gar]) AS TOTAL2,
[Qtde. Garantia]

FROM XML_Acoes(tabela de Origem)

Só que agora preciso colocar aquela validação descrita a abaixo:

Se o ID_fundo for igual o campo ISIN (campos da Tabela de Origem), deverá incluir na Tabela de destino apenas um registro somando os campos valores, exemplo:

tabela XML(Origem)

Id_fundo ISIN LONG_SHT_CD QTY_SOD MKT_VAL_SOD PLEDGED_QTY
------------ ------ ------- ------------- ---------- --------- ----- --------------- -----
Inst AMAR3 L 100 100 0
Inst AMAR3 L 50 50 50
Tarp AMAR6 L 400 800 400

Deverá inserir na Tabela NOVA(Destino) assim:

Inst AMAR3 L 150 150 50
Tarp AMAR6 L 400 800 0
  Agradeço desde já pela ajuda.   Aguardo retorno.
 

Rafmattos
   - 08 jun 2011

vc pegaria o retorno do select que eu falei a cima e colocaria nessa outra tabela

Emerson
   - 10 jun 2011

o que o Rafael está dizendo é que você precisa agrupar o resultado.

algo assim:

Select
  ID_FUNDO,
  ISIN,
  case when [Classe Operação] = 'V'
    then then 'S'
    else 'L'
  end [classe operação],
  sum(([Qtde. Disponível] + [Qtde. Garantia])) AS TOTAL,
  sum(([Valor Find. Isp.] + [Valor Finem. Gar])) AS TOTAL2,
  sum([Qtde. Garantia]) [Qtde. Garantia]
FROM
  XML_Acoes(tabela de Origem)
GROUP BY
  ID_FUNDO, ISIN, 2

talvez haja algum erro de sintaxe, mas basicamente é isso.

Silvianysa
   - 22 jun 2011

Emerson e Rafael,   Obrigada pela dica...deu certo.

Silvianysa
   - 24 jun 2011


Citação:
Emerson e Rafael,   Obrigada pela dica...deu certo.

Silvianysa
   - 24 jun 2011

Ok. Obrigada.