[RESOLVIDO] SQL dinâmico

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.

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?

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

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.

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.

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.