Unificação de strings SQL
23/01/2019
0
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
Post mais votado
24/01/2019
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
Emerson Nascimento
Mais Posts
23/01/2019
Ana Lichirgu
Espero ter ajudado!
23/01/2019
Lucas Dourado
Espero ter ajudado!
23/01/2019
Jucélio Silva
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
23/01/2019
Alex Lekao
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
24/01/2019
Lucas Dourado
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
25/01/2019
Lucas Dourado
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
25/01/2019
Gladstone Matos
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
q SHOW!
Clique aqui para fazer login e interagir na Comunidade :)