Unificação de strings SQL
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
2 String Amortização
3 String Depreciação
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
Curtidas 2
Melhor post
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
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!
Espero ter ajudado!
GOSTEI 1
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?
Espero ter ajudado!
GOSTEI 0
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
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
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
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
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.
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
Lucas Dourado
23/01/2019
Não sei se entendi sua necessidade, mas tente algo assim:
Cara, VOCÊ É DEMAIS! Funcionou corretamente, muito obrigado pela atenção!
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 0
Gladstone Matos
23/01/2019
Não sei se entendi sua necessidade, mas tente algo assim:
Cara, VOCÊ É DEMAIS! Funcionou corretamente, muito obrigado pela atenção!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!
GOSTEI 0