[RESOLVIDO] SQL dinâmico

5 respostas Resolvido
mysqlsql
M

Olá pessoal,
Tenho uma dúvida, e gostaria de saber se vocês podem me ajudar.
Estou precisando utilizar a função SUM para somar duas tabelas distintas e trazer para o cliente esse valor no relatório do iReport. Se eu filtrar o ID do cliente nas subconsultas funciona normalmente, mas eu estou precisando deixar isso mais dinâmico para trazer todos os clientes de uma vez.
Segue meu código abaixo:

SELECT DISTINCT C.*, A.*, ((SELECT DISTINCT SUM(U.honorario_valor) FROM TBL_HONORARIO U INNER JOIN TBL_CLIENTE A ON U.fk_cliente_id_honorario = a.cliente_id WHERE U.HONORARIO_DATA_INICIO BETWEEN ''2020-05-01'' and ''2020-05-30'') + (SELECT DISTINCT SUM(P.processo_valor) FROM TBL_CLIENTE A INNER JOIN TBL_PROCESSO P ON A.cliente_id = P.cliente_id WHERE p.processo_data BETWEEN ''2020-05-01'' and ''2020-05-30'')) as SOMA FROM TBL_CABECALHO C, TBL_HONORARIO U INNER JOIN TBL_CLIENTE A ON U.fk_cliente_id_honorario = a.cliente_id INNER JOIN TBL_PROCESSO P ON A.cliente_id = P.cliente_id WHERE U.HONORARIO_DATA_INICIO BETWEEN ''2020-05-01'' and ''2020-05-30"

Talvez esse código não esteja tão elegante, se além de resolver minha dúvida, ainda tiver como melhorar isso, também seria ótimo.

5 Respostas

M

Olá pessoal,
voltei com uma meia solução do problema.
Eu refiz o código, retirando as subconsultas, e acrescentando a função GROUP BY ao final dela, agora ela ficou assim:

SELECT
DISTINCT
A.cliente_nome,
SUM(P.processo_valor),
SUM(U.honorario_valor)
FROM
TBL_CLIENTE A
INNER JOIN TBL_PROCESSO P ON A.cliente_id = P.cliente_id
INNER JOIN TBL_HONORARIO U ON A.cliente_id = U.fk_cliente_id_honorario
GROUP By A.cliente_id

Só que isso não resolveu todo o problema, o resultado da Soma do Processo vem muito errado quando eu uso o segundo INNER JOIN do Honorario. Sem, o resultado é assim:

cliente_nome SUM(P.processo_valor)
ISSIDIOS TECNOLOGIA 2950
DSADS 1520
ALPHACLIN 2820

Que é o correto, mas com, ele fica assim:

cliente_nome SUM(P.processo_valor) SUM(U.honorario_valor)
ISSIDIOS TECNOLOGIA 38350 5200
DSADS 3040 1000
ALPHACLIN 16920 12480

Não sei como ele tá conseguindo esses valores, alguém pode ter uma ideia?

P

Ao fazeres inner join com uma tabela em que mais do que uma linha é devolvida, vais ter valores repetidos e depois esses valores estão incluidos no sum.
Para perceberes o que está a acontecer, retira o sum e o group by…

Para obter os valores que queres tens de ter subselect para garantir que estás sempre a somar só o que pretendes:

SELECT A.cliente_nome, 
      (SELECT SUM(P.processo_valor) FROM TBL_PROCESSO P where A.cliente_id = P.cliente_id),
      (SELECT sum(U.honorario_valor) FROM TBL_HONORARIO U where A.cliente_id = U.fk_cliente_id_honorario)
  FROM TBL_CLIENTE A
 GROUP BY A.cliente_id
M

pmin, infelizmente esse query não me ajuda, pois ele vai me trazer todos os clientes na consulta, mas eu consegui resolver assim:

SELECT DISTINCT C., A., (SUM(U.honorario_valor) + SUM(DISTINCT P.processo_valor)) AS SOMA FROM TBL_CABECALHO C, TBL_HONORARIO U INNER JOIN TBL_CLIENTE A ON U.fk_cliente_id_honorario = a.cliente_id INNER JOIN TBL_PROCESSO P ON A.cliente_id = P.cliente_id WHERE U.HONORARIO_DATA_INICIO BETWEEN $P{dataInicio} and $P{dataFim} GROUP By A.cliente_id

Ignora o $P, é que eu peguei direto do iReport esse SQL. Mas assim resolveu bem o meu problema, só acrescentando o DISTINCT no SUM.

P

O DISTINCT no sum só resolve se todos os valores forem difernetes. Quando tiveres dois valores iguais (de registos diferentes) não vai somar e vais ter resultados errados.

M
Solucao aceita

Realmente, não tinha pensado dessa forma.
Adaptei sei query, e ele funcionou certinho pra mim. Segue ele:

SELECT A.cliente_nome,
((SELECT SUM(P.processo_valor) FROM TBL_PROCESSO P where A.cliente_id = P.cliente_id AND P.processo_data BETWEEN ‘2020-05-01’ AND ‘2020-05-30’) +
(SELECT sum(U.honorario_valor) FROM TBL_HONORARIO U where A.cliente_id = U.fk_cliente_id_honorario AND U.honorario_data_inicio BETWEEN ‘2020-05-01’ AND ‘2020-05-30’)) AS SOMA
FROM TBL_CLIENTE A INNER JOIN TBL_PROCESSO P ON P.cliente_id = A.cliente_id INNER JOIN TBL_HONORARIO U ON U.fk_cliente_id_honorario = A.cliente_id WHERE U.honorario_data_inicio BETWEEN ‘2020-05-01’ AND ‘2020-05-30’
GROUP BY A.cliente_id

Muito obrigado.

Criado 27 de maio de 2020
Ultima resposta 6 de jun. de 2020
Respostas 5
Participantes 2