Unificação de strings SQL

SQL

SELECT

23/01/2019

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
Lucas Dourado

Lucas Dourado

Curtidas 2

Melhor post

Emerson Nascimento

Emerson Nascimento

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

GOSTEI 3

Mais Respostas

Ana Lichirgu

Ana Lichirgu

23/01/2019

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!
GOSTEI 1
Lucas Dourado

Lucas Dourado

23/01/2019

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?
GOSTEI 0
Jucélio Silva

Jucélio Silva

23/01/2019

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
GOSTEI 0
Alex Lekao

Alex Lekao

23/01/2019

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
GOSTEI 0
Lucas Dourado

Lucas Dourado

23/01/2019

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.
GOSTEI 0
Lucas Dourado

Lucas Dourado

23/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

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

Gladstone Matos

23/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

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


q SHOW!
GOSTEI 0
POSTAR