Ir para conteúdo

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

cristianff

Select sum com registro duplicado

Recommended Posts

Pessoal, tudo bem?
Meu primeiro post com uma dúvida que pode ser trivial para maioria mas que eu emperrei aqui, eu procuro pesquisar muito antes de postar mas essa precisarei de um help.

Estou montando um select para me trazer o fechamento dos resultados com data base, pra isso eu preciso por exemplo tomar como base 31/12/2015, na estrutura do bd as tabelas que serão consultadas serão docum e docum_pgto, a tabela docum contem os documentos gerados e a docum_pgto registra eventos de pagamentos (1 ou mais) para cada documento.

Acontece que quando um docum tem mais de um pagamento na tabela docum_pgto, o registros estão sendo duplicados, o resultado do valor do saldo que eu estou apurando está correto pois ele puxa o valor do pagamento, mas para eu totalizar o valor bruto, tenho esses eventos duplicados que distorcem o resultado.

select s1.cod_empresa,
       s1.num_docum,
       s1.ies_tip_docum,
       s1.dat_emis,
       s1.dat_vencto_s_desc,
       s1.dat_pgto,
       s1.cod_cliente,
       s1.nom_cliente,
       s1.num_cgc_cpf,
       s1.cod_portador,
       s1.ies_pgto_docum,
       s1.val_bruto,
       s1.val_liquido,
       case when sum(val_pago) is null then 0 else sum(val_pago) end val_pago,
       s1.val_saldo,
       case when (s1.dat_pgto>='01/01/2015') then sum(s1.val_pago) + sum(s1.val_saldo) else s1.val_saldo end val_saldo2
       from (

select d.cod_empresa,
       d.num_docum,
       d.ies_tip_docum,
       d.dat_emis,
       d.dat_vencto_s_desc,
       dp.dat_pgto,
       d.cod_cliente,
       c.nom_cliente,
       c.num_cgc_cpf,
       d.cod_portador,
       d.ies_pgto_docum,
       d.val_bruto,
       d.val_liquido,
       dp.val_pago,
       d.val_saldo
    from docum d 
       left join clientes c on (c.cod_cliente=d.cod_cliente)
       left join docum_pgto dp on (dp.cod_empresa=d.cod_empresa) and (dp.num_docum=d.num_docum)
       where d.ies_tip_docum='NC'
       and d.dat_emis<='31/12/2014'
       and d.ies_situa_docum<>'C'
       and d.val_saldo>0
       and d.cod_empresa=01
    
union

select d.cod_empresa,
       d.num_docum,
       d.ies_tip_docum,
       d.dat_emis,
       d.dat_vencto_s_desc,
       dp.dat_pgto,
       d.cod_cliente,
       c.nom_cliente,
       c.num_cgc_cpf,
       d.cod_portador,
       d.ies_pgto_docum,
       d.val_bruto,
       d.val_liquido,
       dp.val_pago,
       d.val_saldo
 
    from docum d 
       left join clientes c on (c.cod_cliente=d.cod_cliente)
       left join docum_pgto dp on (dp.cod_empresa=d.cod_empresa) and (dp.num_docum=d.num_docum)
       where d.ies_tip_docum='NC'
       and d.dat_emis<='31/12/2014'
       and d.ies_situa_docum<>'C'
       and dp.dat_pgto>='01/01/2015'
       and d.cod_empresa=01

) s1
group by s1.cod_empresa,
       s1.num_docum,
       s1.ies_tip_docum,
       s1.dat_emis,
       s1.dat_vencto_s_desc,
       s1.cod_cliente,
       s1.nom_cliente,
       s1.num_cgc_cpf,
       s1.cod_portador,
       s1.ies_pgto_docum,
       s1.val_bruto,
       s1.val_liquido,
       s1.val_saldo,
       s1.dat_pgto

o retorno deste comando é o seguinte:

 

 

1 10549 NC 24/07/2014 24/07/2014 19/08/2015 959 EMPRESA NOME DA EMPRESA 27 000.000.000/0001-26 903 T 313,74 313,74 278,40 - 278,40
1 10549 NC 24/07/2014 24/07/2014 23/11/2015 959 EMPRESA NOME DA EMPRESA 27 000.000.000/0001-26 903 T 313,74 313,74 35,34 - 35,34
1 10550 NC 24/07/2014 24/07/2014 19/08/2015 959 EMPRESA NOME DA EMPRESA 27 000.000.000/0001-26 903 T 650,90 650,90 163,38 - 163,38
1 10550 NC 24/07/2014 24/07/2014 23/11/2015 959 EMPRESA NOME DA EMPRESA 27 000.000.000/0001-26 903 T 650,90 650,90 487,52 - 487,52

1 10975 NC 03/10/2014 03/10/2014 24/02/2015 332 EMPRESA NOME DA EMPRESA 15 000.000.000/0001-14 903 T 1.350,00 1.350,00 135,00 - 135,00
1 10975 NC 03/10/2014 03/10/2014 20/02/2015 332 EMPRESA NOME DA EMPRESA 49 000.000.000/0001-48 903 T 1.350,00 1.350,00 1.215,00 - 1.215,00
1 11476 NC 08/12/2014 08/12/2014 12/02/2015 29 EMPRESA NOME DA EMPRESA 18 000.000.000/0001-17 903 T 1.200,00 1.200,00 240,00 - 240,00
1 11476 NC 08/12/2014 08/12/2014 29/01/2015 29 EMPRESA NOME DA EMPRESA 18 000.000.000/0001-17 903 T 1.200,00 1.200,00 960,00 - 960,00


Então os registros de documentos 10549, 10550, 10975, 11476 repetem pois tiveram mais de um pagamento, o valor da última coluna que é a soma do saldo está ok pois ele soma o valor do pgto com o valor do saldo, mas a primeira e a segunda coluna que são os valores brutos, eles estão duplicando.

 

Tentei organizar a consulta para ficar de fácil compreensão, fiquei praticamente 10 anos relar a mão em SQL, é complicado, fica enferrujado.. Pode ser um detalhe simples, mas se alguém puder da um help ficaria muito agradecido.

 

Valeu

Compartilhar este post


Link para o post
Compartilhar em outros sites

Tente agrupando internamente

select s1.cod_empresa,
       s1.num_docum,
       s1.ies_tip_docum,
       s1.dat_emis,
       s1.dat_vencto_s_desc,
       s1.dat_pgto,
       s1.cod_cliente,
       s1.nom_cliente,
       s1.num_cgc_cpf,
       s1.cod_portador,
       s1.ies_pgto_docum,
       s1.val_bruto,
       s1.val_liquido,
       case when sum(val_pago) is null then 0 else sum(val_pago) end val_pago,
       s1.val_saldo,
       case when (s1.dat_pgto>='01/01/2015') then sum(s1.val_pago) + sum(s1.val_saldo) else s1.val_saldo end val_saldo2
       from (

select d.cod_empresa,
       d.num_docum,
       d.ies_tip_docum,
       d.dat_emis,
       d.dat_vencto_s_desc,
       dp.dat_pgto,
       d.cod_cliente,
       c.nom_cliente,
       c.num_cgc_cpf,
       d.cod_portador,
       d.ies_pgto_docum,
       sum(d.val_bruto) val_bruto,
       sum(d.val_liquido) val_liquido,
       sum(dp.val_pago) val_pago,
       sum(d.val_saldo) val_saldo
    from docum d
       left join clientes c on (c.cod_cliente=d.cod_cliente)
       left join docum_pgto dp on (dp.cod_empresa=d.cod_empresa) and (dp.num_docum=d.num_docum)
       where d.ies_tip_docum='NC'
       and d.dat_emis<='31/12/2014'
       and d.ies_situa_docum<>'C'
       and d.val_saldo>0
       and d.cod_empresa=01
    
    group by .cod_empresa,
       d.num_docum,
       d.ies_tip_docum,
       d.dat_emis,
       d.dat_vencto_s_desc,
       dp.dat_pgto,
       d.cod_cliente,
       c.nom_cliente,
       c.num_cgc_cpf,
       d.cod_portador,
       d.ies_pgto_docum
union

select d.cod_empresa,
       d.num_docum,
       d.ies_tip_docum,
       d.dat_emis,
       d.dat_vencto_s_desc,
       dp.dat_pgto,
       d.cod_cliente,
       c.nom_cliente,
       c.num_cgc_cpf,
       d.cod_portador,
       d.ies_pgto_docum,
       sum(d.val_bruto) val_bruto,
       sum(d.val_liquido) val_liquido,
       sum(dp.val_pago) val_pago,
       sum(d.val_saldo) val_saldo
 
    from docum d
       left join clientes c on (c.cod_cliente=d.cod_cliente)
       left join docum_pgto dp on (dp.cod_empresa=d.cod_empresa) and (dp.num_docum=d.num_docum)
       where d.ies_tip_docum='NC'
       and d.dat_emis<='31/12/2014'
       and d.ies_situa_docum<>'C'
       and dp.dat_pgto>='01/01/2015'
       and d.cod_empresa=01
       
       group by .cod_empresa,
       d.num_docum,
       d.ies_tip_docum,
       d.dat_emis,
       d.dat_vencto_s_desc,
       dp.dat_pgto,
       d.cod_cliente,
       c.nom_cliente,
       c.num_cgc_cpf,
       d.cod_portador,
       d.ies_pgto_docum

) s1
group by s1.cod_empresa,
       s1.num_docum,
       s1.ies_tip_docum,
       s1.dat_emis,
       s1.dat_vencto_s_desc,
       s1.cod_cliente,
       s1.nom_cliente,
       s1.num_cgc_cpf,
       s1.cod_portador,
       s1.ies_pgto_docum,
       s1.val_bruto,
       s1.val_liquido,
       s1.val_saldo,
       s1.dat_pgto

Compartilhar este post


Link para o post
Compartilhar em outros sites

  • Conteúdo Similar

    • Por nascimnbeni80@gmail.com
      Caros amigos preciso somar campos de varias tabelas (15 no total), nos quais eu quero somar somente os campos iguais nas data específicas abaixo segue um exemplo.
      OBS: precisa ser sempre o ultimo registro de cada tabela, então considere usar LIMIT 1 e ORDER BY id DESC
       

    • Por jackvinte
      Olá, sou nova por aqui.
       
      É possível fazer um select join dentro de um case, segue o que preciso:
       
      select m.ArquivoOrdemMov,m.ContadorAgenteMov,m.DataMov,m.SeqOrdemMov,m.SeqProduto,m.SaldoTotalMov,p.DescricaoProduto --,case when m.ArquivoOrdemMov='OC'then 'Preço' /*dentro do then preciso pegar o preço ->select ci.CustoOCItem from OCItem ci join OC c on c.SeqOC=ci.SeqOC*/ --else 'Sem valor'end from Mov m join MovFisica f on m.SeqMovFisica=f.SeqMovFisica join OC c on m.ContadorAgenteMov=c.ContadorAgenteOC join Produto p on m.SeqProduto=p.SeqProduto where m.ArquivoOrdemMov='OC' and c.SituacaoOC='FECHADA'  
    • Por SAS Junior
      Olá, sou novo aqui e em SQL Server, estou com um problema para buscar um resultado. 
      Caso hoje seja segunda, trazer as instalações dos últimos 3 dias (sexta, sábado e domingo), caso não seja, trazer só os de ontem, tentei da forma abaixo e muitas outras e não consegui, desde já agradeço.    
      SELECT codigoCliente AS [CÓD], CpfCnpj AS [CPF/CNPJ] ,NomeFantasia as [NOME FANTASIA] ,UPPER(NomeContato) as [NOME DE CONTATO] ,CASE WHEN CLI.DDDCelular IS NULL THEN 'NÃO TEM' ELSE DDDCelular END AS [DDD CEL] ,CASE WHEN Celular IS NULL THEN 'NÃO TEM' ELSE Celular END AS CELULAR ,CASE WHEN DDDTelefone IS NULL THEN 'NÃO TEM' ELSE DDDTelefone END AS [DDD TEL] ,CASE WHEN Telefone IS NULL THEN 'NÃO TEM' ELSE Telefone END AS TELEFONE ,DataInstalacao AS [INSTALAÇÃO] ,DATEPART(weekday,DataInstalacao) as [DIASEMANA] ,UPPER(Departamento) AS [DEPTO CAD] ,upper(UsuarioCadastro) as [CADASTRADO POR] ,CASE WHEN UPPER(EMAIL) IS NULL THEN 'NÃO TEM EMAIL' ELSE UPPER(EMAIL) END AS EMAIL FROM CLIENTE WHERE (CASE WHEN (DATEPART(weekday,GETDATE()) = '2' THEN DATEPART(DAY, DataInstalacao) >= DATEPART(DAY, GETDATE()-3) ELSE DATEPART(DAY, DataInstalacao) = DATEPART(DAY, GETDATE()-1) END) AND MONTH(DataInstalacao) = MONTH(GETDATE()) AND YEAR(DataInstalacao) = YEAR(GETDATE()) AND Situacao = 'MAQUINA INSTALADA'  
    • Por neto_celino
      Estou usando o seguinte código para somar um SELECT, mas cheguei em um determinado ponto que travei.
       
      Tenho 400 registros na DB e tenho que somar alguns registros somente. Ou seja, somar o (valortotal) de alguns ID's somente. 
      É possivel e por onde vou ? rs.
      <?php $subtotal = "SELECT SUM(valortotal) from tbl_compras WHERE id = VariosIdAqui"; $resultado = mysql_query($subtotal); $registro = mysql_fetch_row($resultado); echo number_format($registro[0], 2, ',', ' ') ;  ?>      
    • Por Giovanird
      Olá amigos!
      Tenha a seguinte estrutura no banco MySQL
      COD   |   PONTOX  |  PONTOY  |  ATLETAX       |  ATLETAY
      1         |   0               |  1               |  Maria              |  João
      2         |   2               |  0               |  João               |  Maria
      3         |   0               |  2               |  Maria              |  João
      4         |   7               |  5               |  Maria              |  João
      5         |   0               |  3               |  João               |  Maria
      6         |   2               |  1               |  João               |  Maria
      7         |   0               |  6               |  Maria              |  João
      8         |   4               |  0               |  João               |  Maria
       
      Preciso de ajuda para somar quantos pontos fez o atleta João nos últimos 5 torneios (COD 8, 7, 6, 5 e 4)  Há momento que o João jogou em X e outro momento em Y.
      Abaixo segue meu Select, onde a soma dos pontos deve ser 17.
       
      nomeatleta = "João"
      Set soma= banco.execute("SELECT sum(PONTOX ) AS somax,  sum(PONTOY ) AS somay FROM (select cod, pontox, pontoy, atletax, atletay  from torneios where (atletax like '"&nomeatleta&"' or atletay like '"&nomeatleta&"') order by cod desc limit 5) AS temp")
       
×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.