Unificação de strings SQL

23/01/2019

18

Olá!

Tenho 3 strings funcionando corretamente, porém quando tento unifica-las, o valor vem o mesmo para todas as linhas.

Como faço para unificar sem que o valor se repita?

1 String Total
SELECT
A.NUM_ID_BEM_PAT,
B.DES_BEM_PAT,
SUM(A.VAL_ORIGINAL) AS TOTAL
FROM EMS5.REG_CALC_BEM_PAT A
INNER JOIN
EMS5.BEM_PAT B ON A.NUM_ID_BEM_PAT = B.NUM_ID_BEM_PAT
WHERE A.COD_CENAR_CTBL=''FISCAL''
AND A.IND_TRANS_CALC_BEM_PAT=''Implantação''
AND A.LOG_CTBZ_BEM_PAT=''1''
GROUP BY A.NUM_ID_BEM_PAT, B.DES_BEM_PAT


2 String Amortização
SELECT
A.NUM_ID_BEM_PAT,
B.DES_BEM_PAT,
SUM(DISTINCT(A.VAL_DPR_VAL_ORIGIN)) AS AMORTIZADO
FROM EMS5.REG_CALC_BEM_PAT A
INNER JOIN
EMS5.BEM_PAT B ON A.NUM_ID_BEM_PAT = B.NUM_ID_BEM_PAT
WHERE A.DAT_CALC_PAT=(SELECT MAX(A.DAT_CALC_PAT) FROM EMS5.REG_CALC_BEM_PAT A WHERE A.NUM_ID_BEM_PAT=A.NUM_ID_BEM_PAT)
AND A.COD_CENAR_CTBL=''FISCAL''
AND A.IND_TRANS_CALC_BEM_PAT=''Amortização''
GROUP BY A.NUM_ID_BEM_PAT, B.DES_BEM_PAT


3 String Depreciação
SELECT
A.NUM_ID_BEM_PAT,
B.DES_BEM_PAT,
SUM(DISTINCT(A.VAL_DPR_VAL_ORIGIN)) AS DEPRECIADO
FROM EMS5.REG_CALC_BEM_PAT A
INNER JOIN
EMS5.BEM_PAT B ON A.NUM_ID_BEM_PAT = B.NUM_ID_BEM_PAT
WHERE A.DAT_CALC_PAT=(SELECT MAX(A.DAT_CALC_PAT) FROM EMS5.REG_CALC_BEM_PAT A WHERE A.NUM_ID_BEM_PAT=A.NUM_ID_BEM_PAT)
AND A.COD_CENAR_CTBL=''FISCAL''
AND A.IND_TRANS_CALC_BEM_PAT=''Depreciação''
GROUP BY A.NUM_ID_BEM_PAT, B.DES_BEM_PAT


Tentativa de String unificada
SELECT
A.NUM_ID_BEM_PAT, B.DES_BEM_PAT, (SELECT SUM(A.VAL_ORIGINAL)
FROM EMS5.REG_CALC_BEM_PAT A
WHERE A.COD_CENAR_CTBL=''FISCAL''
AND A.IND_TRANS_CALC_BEM_PAT=''Implantação''
AND A.LOG_CTBZ_BEM_PAT=''1'') AS TOTAL, (SELECT SUM(DISTINCT(A.VAL_DPR_VAL_ORIGIN))
FROM EMS5.REG_CALC_BEM_PAT A
WHERE A.DAT_CALC_PAT=(SELECT MAX(A.DAT_CALC_PAT) FROM EMS5.REG_CALC_BEM_PAT A WHERE A.NUM_ID_BEM_PAT=A.NUM_ID_BEM_PAT)
AND A.COD_CENAR_CTBL=''FISCAL''
AND A.IND_TRANS_CALC_BEM_PAT=''Amortização'') AS AMORTIZADO, (SELECT SUM(DISTINCT(A.VAL_DPR_VAL_ORIGIN))
FROM EMS5.REG_CALC_BEM_PAT A
WHERE A.DAT_CALC_PAT=(SELECT MAX(A.DAT_CALC_PAT) FROM EMS5.REG_CALC_BEM_PAT A WHERE A.NUM_ID_BEM_PAT=A.NUM_ID_BEM_PAT)
AND A.COD_CENAR_CTBL=''FISCAL''
AND A.IND_TRANS_CALC_BEM_PAT=''Depreciação'') AS DEPRECIADO
FROM EMS5.REG_CALC_BEM_PAT A
INNER JOIN
EMS5.BEM_PAT B ON A.NUM_ID_BEM_PAT = B.NUM_ID_BEM_PAT
GROUP BY A.NUM_ID_BEM_PAT, B.DES_BEM_PAT
Responder

Post mais votado

24/01/2019

Não sei se entendi sua necessidade, mas tente algo assim:

SELECT
	A.NUM_ID_BEM_PAT,
	B.DES_BEM_PAT,
	SUM(CASE WHEN A.IND_TRANS_CALC_BEM_PAT = 'Implantação' AND A.LOG_CTBZ_BEM_PAT = '1' THEN A.VAL_ORIGINAL ELSE 0 END) AS TOTAL,

	SUM(CASE WHEN A.IND_TRANS_CALC_BEM_PAT = 'Amortização'
			AND A.DAT_CALC_PAT = (SELECT MAX(A2.DAT_CALC_PAT) FROM EMS5.REG_CALC_BEM_PAT A2
									WHERE A2.NUM_ID_BEM_PAT=A.NUM_ID_BEM_PAT) THEN A.VAL_DPR_VAL_ORIGIN ELSE 0 END) AS AMORTIZADO,

	SUM(CASE WHEN A.IND_TRANS_CALC_BEM_PAT = 'Depreciação'
			AND A.DAT_CALC_PAT = (SELECT MAX(A2.DAT_CALC_PAT) FROM EMS5.REG_CALC_BEM_PAT A2
									WHERE A2.NUM_ID_BEM_PAT=A.NUM_ID_BEM_PAT) THEN A.VAL_DPR_VAL_ORIGIN ELSE 0 END) AS DEPRECIADO
FROM
	EMS5.REG_CALC_BEM_PAT A
INNER JOIN
	EMS5.BEM_PAT B ON A.NUM_ID_BEM_PAT = B.NUM_ID_BEM_PAT
WHERE
	A.COD_CENAR_CTBL = 'FISCAL'
GROUP BY
	A.NUM_ID_BEM_PAT, B.DES_BEM_PAT

Responder

Mais Posts

23/01/2019

Ana Lichirgu

Bom dia! Possivelmente em algum join seu está incorreto...Você já viu se você colocar left join (ou right join, dependendo da situação) ao invés de inner join, se traz as informações corretamente?

Espero ter ajudado!
Responder

23/01/2019

Lucas Dourado

Bom dia! Possivelmente em algum join seu está incorreto...Você já viu se você colocar left join (ou right join, dependendo da situação) ao invés de inner join, se traz as informações corretamente?

Espero ter ajudado!
Então, mas quando a string é separada, o select traz os dados corretamente. Na unificação, preciso alterar o Join, então?
Responder

23/01/2019

Jucélio Silva

E ae Lucas, blz cara,

Então olhando por cima sua query tem um erro , sua sub query mais interna te retorna a ultima data e filtra pelos tipos "depreciacao , amortizacao , implantacao ", mas ao soma " SELECT sum(DISTINCT(a.val_dpr_val_origin)) FROM ems5.reg_calc_bem_pat a " você não leva a mesma regra, logo terá uma data "provavelmente parecida entre elas" , mas sem levar em conta o tipo especificado na sub query ... Para resolver isso, faz um join no seu sum e coloca as mesmas condições, ai sim você teria o filtro por tipo conforme a ultima data.

Tem N forma mais simples de fazer isso, uma delas é usar union separando suas consultas e alinhando em uma unica linha , ficaria até mais facil de entender, sem falar que a consulta seria mais leve e rápida....

XD
Responder

23/01/2019

Alex Lekao

Oi Lucas, boa tarde!!!

Cara dependendo do que vc deseja, eu recomendo usar outer apply(não tem especificação no post se é SQL Server ou não.).

Vc consegue fazer uma série de tratamentos no outer, que eh um script normal basicamente, e com isto vc so apresenta os resultados no script Principal.

Em varios casos meus aqui, o outer apply se comportou mais performatico que os joins ou uniões.

Espero ter ajudado a esclarecer.

Atenciosamente,

Alex
Responder

24/01/2019

Lucas Dourado

E ae Lucas, blz cara,

Então olhando por cima sua query tem um erro , sua sub query mais interna te retorna a ultima data e filtra pelos tipos "depreciacao , amortizacao , implantacao ", mas ao soma " SELECT sum(DISTINCT(a.val_dpr_val_origin)) FROM ems5.reg_calc_bem_pat a " você não leva a mesma regra, logo terá uma data "provavelmente parecida entre elas" , mas sem levar em conta o tipo especificado na sub query ... Para resolver isso, faz um join no seu sum e coloca as mesmas condições, ai sim você teria o filtro por tipo conforme a ultima data.

Tem N forma mais simples de fazer isso, uma delas é usar union separando suas consultas e alinhando em uma unica linha , ficaria até mais facil de entender, sem falar que a consulta seria mais leve e rápida....

XD
Mais preciso o coluna valor se distribua em 3, por isso existe 3 strings. Por existir essa divisão, o union não funcionaria.
Responder

25/01/2019

Lucas Dourado

Não sei se entendi sua necessidade, mas tente algo assim:

SELECT
	A.NUM_ID_BEM_PAT,
	B.DES_BEM_PAT,
	SUM(CASE WHEN A.IND_TRANS_CALC_BEM_PAT = 'Implantação' AND A.LOG_CTBZ_BEM_PAT = '1' THEN A.VAL_ORIGINAL ELSE 0 END) AS TOTAL,

	SUM(CASE WHEN A.IND_TRANS_CALC_BEM_PAT = 'Amortização'
			AND A.DAT_CALC_PAT = (SELECT MAX(A2.DAT_CALC_PAT) FROM EMS5.REG_CALC_BEM_PAT A2
									WHERE A2.NUM_ID_BEM_PAT=A.NUM_ID_BEM_PAT) THEN A.VAL_DPR_VAL_ORIGIN ELSE 0 END) AS AMORTIZADO,

	SUM(CASE WHEN A.IND_TRANS_CALC_BEM_PAT = 'Depreciação'
			AND A.DAT_CALC_PAT = (SELECT MAX(A2.DAT_CALC_PAT) FROM EMS5.REG_CALC_BEM_PAT A2
									WHERE A2.NUM_ID_BEM_PAT=A.NUM_ID_BEM_PAT) THEN A.VAL_DPR_VAL_ORIGIN ELSE 0 END) AS DEPRECIADO
FROM
	EMS5.REG_CALC_BEM_PAT A
INNER JOIN
	EMS5.BEM_PAT B ON A.NUM_ID_BEM_PAT = B.NUM_ID_BEM_PAT
WHERE
	A.COD_CENAR_CTBL = 'FISCAL'
GROUP BY
	A.NUM_ID_BEM_PAT, B.DES_BEM_PAT

Cara, VOCÊ É DEMAIS! Funcionou corretamente, muito obrigado pela atenção!
Responder
Não sei se entendi sua necessidade, mas tente algo assim:

SELECT
	A.NUM_ID_BEM_PAT,
	B.DES_BEM_PAT,
	SUM(CASE WHEN A.IND_TRANS_CALC_BEM_PAT = 'Implantação' AND A.LOG_CTBZ_BEM_PAT = '1' THEN A.VAL_ORIGINAL ELSE 0 END) AS TOTAL,

	SUM(CASE WHEN A.IND_TRANS_CALC_BEM_PAT = 'Amortização'
			AND A.DAT_CALC_PAT = (SELECT MAX(A2.DAT_CALC_PAT) FROM EMS5.REG_CALC_BEM_PAT A2
									WHERE A2.NUM_ID_BEM_PAT=A.NUM_ID_BEM_PAT) THEN A.VAL_DPR_VAL_ORIGIN ELSE 0 END) AS AMORTIZADO,

	SUM(CASE WHEN A.IND_TRANS_CALC_BEM_PAT = 'Depreciação'
			AND A.DAT_CALC_PAT = (SELECT MAX(A2.DAT_CALC_PAT) FROM EMS5.REG_CALC_BEM_PAT A2
									WHERE A2.NUM_ID_BEM_PAT=A.NUM_ID_BEM_PAT) THEN A.VAL_DPR_VAL_ORIGIN ELSE 0 END) AS DEPRECIADO
FROM
	EMS5.REG_CALC_BEM_PAT A
INNER JOIN
	EMS5.BEM_PAT B ON A.NUM_ID_BEM_PAT = B.NUM_ID_BEM_PAT
WHERE
	A.COD_CENAR_CTBL = 'FISCAL'
GROUP BY
	A.NUM_ID_BEM_PAT, B.DES_BEM_PAT

Cara, VOCÊ É DEMAIS! Funcionou corretamente, muito obrigado pela atenção!


q SHOW!
Responder

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários. Para saber mais sobre o uso de cookies,
consulte nossa política de privacidade. Ao continuar navegando em nosso site, você concorda com a nossa política.

Aceitar