SQL UNION E GROUPBY

02/01/2015

0

Olá pessoal, preciso de ajuda com uma instrução SQL que estou com dificuldade de acertar o resultado.

USO INTERBASE 6.5.
Preciso fazer uma consulta SQL onde me retorne o valor da comissão do vendedor abatendo as devoluções feitas no mesmo período.

Segue SQL e o resultado obtido:

SELECT TAB026.nvendedor, Tab017.tdescricao, SUM(TAB027.ntotal * (TAB006.ncomissao)/100) as Comissao
FROM TAB017, TAB027, TAB026, TAB006
WHERE (Tab017.chave = Tab026.nvendedor)
  AND (Tab027.nnumero = Tab026.chave)
  AND (TAB027.nproduto = TAB006.nproduto)
  AND (TAB027.ttabela = Tab006.tdescricao)
  AND (Tab026.DDATA BETWEEN '29.12.2014 00:00' AND '29.12.2014 23:59')
  AND tab026.nempresa = 1
  AND TAB026.tcfop = '5.102'
  AND tab026.ndocumentoprincipal IS NOT NULL
  Group BY TAB026.nvendedor, Tab017.tdescricao
union
SELECT Tab026.nvendedor, TAB017.tdescricao,
      (SUM(TAB083.ntotal * (TAB006.ncomissao)/100)*-1) as ComissaoDV
FROM tab082,  TAB083, TAB026, TAB017, TAB006
where TAB082.chave = Tab083.nnumero
  AND TAB026.chave = TAB082.npedido
  AND TAB017.chave = TAB026.nvendedor
  AND TAB006.tdescricao = TAB083.ttabela
  AND TAB006.nproduto = TAB083.nproduto
  AND (Tab082.DDATA BETWEEN '29.12.2014 00:00' AND '29.12.2014 23:59')
  Group BY TAB026.nvendedor, Tab017.tdescricao


O Resultado:
[img:descricao=Resultado Sql]http://arquivo.devmedia.com.br/forum/imagem/404598-20150102-164437.png[/img]

Preciso que a coluna comissão tenha o resultado da comissão devida já descontando o valor negativo referente a devolução no período.

Agradeço desde já a ajuda.

Abraço
Roberto

Roberto

Responder

Posts

05/01/2015

Roberto

Alex e Marisiana, boa tarde..

Alex, já tinha visto sobre a soma do Resultado, mas obrigado por avisa.

Marisiana estou tentando fazer o que me sugeriu mas ainda sem resultado. Estou olhando as chaves conforme vc me orientou e sobre a ligação da Tab027 com a TAB082 é TAB082.npedido = TAB027.nnumero é a unica ligação entre elas que é o Numero do pedido. O que eu estou vendo aqui com mais calma e acabei achando um outro impasse.

Os pedido são gravados como PEDIDO PAI(TAB026) e PRODUTOS PEDIDO PAI(TAB027) e deste pedido pai é gerado pelo menos 1 pedido FILHO que é o pedido de ENTREGA. e as devoluções só são geradas por esses pedidos de entrega. O Problema do valor das comissões estarem alem do esperado se deve a duplicidade destes pedidos, PAI e Filho.

Eu sei que fica difícil pra vcs saberem o que ocorre devido não saber as estruturas da tabela e dos dados, por isso agradeço e muito o esforço. Estou vendo aqui como resolver isso e logo coloco o resultado.

Obrigado

Abraço
Responder

05/01/2015

Alex Lekao

Blz Roberto.

Precisando de algo posta ae, se estiver ao meu alcanco a gente ve o que consegue. rsrsr

Abraco.
Responder

06/01/2015

Marisiana Battistella

Boa tarde!!

Esses pedidos de ENTREGA são identificados como?
Eles são cadastrados na tabela q contém os pedidos FILHOS?
Existe algum campo TIPO que diferencie um do outro?
Responder

06/01/2015

Roberto

Boa tarde, então Marisiana eles a principio eu identifiquei pelo Tab026.ndocumentoprincipal is not null. Pois os pedidos filhos possuem esses campos nulos. Mas as devoluções só são geradas pelos filhos então na consulta separada de comissão funciona e na de devolução também mas qndo tento unir em uma única consulta a situação do campo tab026.ndocumentoprincipal is null ai então bloqueia a consulta das devoluções. Eu acho que consegui te explicar rsrs. E não achei outro campo para diferenciar esses pedidos para não gerar comissão em duplicidade, pedido pai e pedido filho.

Espero que não tenha te confundido mais. Olhe no primeiro post as consultas ligadas pelo union. VC entenderá melhor.

Obrigado

Abraço
Responder

06/01/2015

Marisiana Battistella

Eu acho que entendi...
Você identifica os documentos que são devoluções atrás desses dois filtros:?
  AND TAB026.tcfop = ''5.102/P''
  AND TAB026.ndocumentoprincipal IS NOT NULL
Responder

06/01/2015

Marisiana Battistella

Uma solução bem "chutada" porque não sei se funciona no SGBD q vc está usando, mas no Oracle funcionaria:

SELECT TAB026.nvendedor, TAB017.tdescricao,
       CASE 
          WHEN TAB026.tcfop = '5.102/P' AND TAB026.ndocumentoprincipal IS NOT NULL THEN
              SUM(TAB027.ntotal  * (TAB006.ncomissao)/100)
          END as Comissao,
       (SUM(TAB083.ntotal * (TAB006.ncomissao)/100)  * - 1) as ComissaoDev,
       ( CASE 
          WHEN TAB026.tcfop = '5.102/P' AND TAB026.ndocumentoprincipal IS NOT NULL THEN
              SUM(TAB027.ntotal  * (TAB006.ncomissao)/100)
          END 
          - (SUM(TAB083.ntotal * (TAB006.ncomissao)/100)  * - 1) 
       ) as resultado
FROM TAB017
INNER JOIN TAB026 ON TAB017.chave   = TAB026.nvendedor
INNER JOIN TAB027 ON Tab027.nnumero = TAB026.chave
INNER JOIN TAB006 ON TAB006.nproduto= TAB027.nproduto   AND TAB006.tdescricao = TAB027.ttabela
LEFT JOIN TAB083 ON TAB083.ttabela = TAB006.tdescricao AND TAB083.nproduto   = TAB006.nproduto
LEFT JOIN TAB082 ON TAB082.chave   = TAB083.nnumero
INNER JOIN TAB017 ON TAB017.chave   = TAB026.nvendedor
WHERE TAB026.DDATA BETWEEN '29.12.2014 00:00' AND '29.12.2014 23:59'
 AND TAB082.ddata BETWEEN '29.12.2014 00:00' AND '29.12.2014 23:59'
  AND TAB026.nempresa = 1
  Group BY TAB026.nvendedor, TAB017.tdescricao
Responder

07/01/2015

Roberto

Boa tarde Marisiana e Alex.

Ta difícil, rsrs....o interbase que uso é o 6.0 e ele não aceita CASE e nem SubSelect após o From.

Não estou conseguindo gerar uma unica consulta acredito que por esse motivo. Como não posso gerar View ai ficou quase impossível.

Agradeço a ajuda de vcs imensamente. Estou tentando achar a solução e estou testando cada sugestão de vcs e revendo para ver se consigo.

Muito Obrigado e assim que tiver novas noticias informo a vcs.

Grande Abraço
Responder

07/01/2015

Alex Lekao

Oi Roberto,

Verifica se na sua versao do interbase ja existe o comando DECODE, ele tem no Oracle, nao sei a partir de qdo, no firebird parece que existe desde a versao 1.5, ele eh similar ao case.

Se me lembro bem no que pesquisei seria mais ou menos assim:

DECODE(1,'UM',2,'DOIS')


Mas teria que pesquiser a sintaxe. rsrsr

Abraco.
Responder

07/01/2015

Roberto

Vou ver Alex...grato
Responder

07/01/2015

Alex Lekao

Blz...

qualquer coisa falar ai.

Abraco.
Responder

07/01/2015

Marisiana Battistella

Não tem de quê Roberto!
Como é ruim não ter os recursos necessários pra trabalhar...

Bom trabalho!
Responder

07/01/2015

Alex Lekao

Muito nao eh?

o ERP da Software house que usamos anteriormente nao dava a possibilidade de implementarmos relatorios proprios e utilizamos Firebird, nossa como era trabalhoso.

Montava relatorios fazendo coleta de dados no banco e depois manipulando o restante dos dados no Excel e enviava para os responsaveis, muito trabalho. rsrs

Hj desenvolvo o que preciso usando comandos sql e tags proprias do ERP, nossa estou no paraiso. rsrsr

E olha que manjo quase nada de SQL. rsrsr

Não tem de quê Roberto!
Como é ruim não ter os recursos necessários pra trabalhar...

Bom trabalho!
Responder

07/01/2015

Roberto

Pessoal muito obrigado pela ajuda.

Em meio a essas dificuldades e a urgência neste relatório eu utilizei as duas consultas separadas, a de comissão e a de devolução em Query no Delphi e então fiz a manipulação necessária onde pude obter o resultado tão esperado.

Marisiana e Alex Agradeço mesmo.

Sem os recursos é quase impossível de eu conseguir fazer rodar em um único script, eu sei pouco de SQL e por isso também não consigo passar tudo o que ocorre pra vcs. Que me ajudaram e muito mesmo não sabendo a estrutura do banco.

Deixo como RESOLVIDO pois de qualquer maneira consegui o resultado esperado.
Forte Abraço,
Estarei mais presente neste Fórum e espero contar com a ajuda de vcs e também eu ajudar no que eu souber.

t+
Beto
Responder

08/01/2015

Marisiana Battistella

Por nada Roberto!!
Participe sempre que puder!
Responder

08/01/2015

Alex Lekao

Blz Roberto!!!

Disponha, precisando eh so falar.

Bem vindo ao forum!!!
Responder

Assista grátis a nossa aula inaugural

Assitir aula

Saiba por que programar é uma questão de
sobrevivência e como aprender sem riscos

Assistir agora

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar