Usuário com melhor resposta
Problema com union all

Pergunta
-
Oi, pessoal estou com problema de union all entre select. ate um pouco estranho de Error converting data type varchar to numeric na linha 1 do primeiro select. sendo se eu executar eles separado nao da esse erro. o select e esse:
SELECT MTAREFA.CODTRF AS CODIGO,
MCMP.CODCMP AS COMPOSICAO,
MCMP.CODUND AS UNIDADE,
MCMP.PRODUCAOPORHORA AS PRODUCAO_EQUIPE,
MTAREFA.NOME AS SERVICO,
MISM.DESCISM AS INSUMO,
MISM.CODUND AS UNIDADE_INSUMO,
MCMP.EQUIPAMENTO AS CUSTO_HORARIO_DA_EQUIPE_MECANICA,
MCMP.MAOOBRA AS CUSTO_HORARIO_DA_MAO_DE_OBRA_SUPLEMENTAR,
MCMP.MATERIAL AS CUSTO_UNITARIO_DA_UTILIZACAO_DE_MARTERIAS,
MCMP.TRANSPORTE AS CUSTO_UNITARIO_DE_TRANSPORTE_DE_MATERIAS,
MCMP.VALORCOMLEI AS CUSTO_UNITARIO_DO_SERVICO,
MCMP.VALORBDI AS BDI,
MCMP.VALORTOTAL AS PRECO_UNITARIO_DO_SERVICO,
CASE WHEN MRECCMP.GRUPODNER = 'B' THEN CONVERT(NVARCHAR, MISM.FATORK)
ELSE ''
END AS FATORK,
MISM.GRUPODNER AS GRUPODNIT,
MRECCMP.DMT/10000 AS DMT,
CONVERT(NUMERIC(15,4),ROUND(MRECCMP.QUANTIDADE/10000,4)) AS QTDE,
CONVERT(NUMERIC(15,4),ROUND(MRECCMP.VALORUNIT,4)) AS PRECO_PRODUTIVO,
CONVERT(NUMERIC(15,4),ROUND(MRECCMP.PRECOIMPRODUTI vou,4)) AS PRECO_IMPRODUTIVO,
CONVERT(NUMERIC(15,4),ROUND(MRECCMP.VALORTOTAL,4)) AS VALOR_TOTAL,
CONVERT(NUMERIC(15,4),ROUND(MRECCMP.COEFICIENTEPRO DUTIVO/10000,4)) AS COEFICIENTEPRODUTIVO,
CONVERT(NUMERIC(15,4),ROUND(MRECCMP.COEFICIENTEIMP RODUTIVO/10000,4)) COEFICIENTEIMPRODUTIVO,
'COMPOSIÇAO' AS TABELA
FROM MTAREFA
INNER JOIN MCMP
INNER JOIN MRECCMP
INNER JOIN MISM
ON MISM.CODCOLIGADA = MRECCMP.CODCOLIGADA
AND MISM.IDPRJ = MRECCMP.IDPRJ
AND MISM.IDISM = MRECCMP.IDISM
ON MRECCMP.CODCOLIGADA = MCMP.CODCOLIGADA
AND MRECCMP.IDPRJ = MCMP.IDPRJ
AND MRECCMP.IDCMP = MCMP.IDCMP
ON MCMP.CODCOLIGADA = MTAREFA.CODCOLIGADA
AND MCMP.IDPRJ = MTAREFA.IDPRJ
AND MCMP.IDCMP = MTAREFA.IDCMP
WHERE MTAREFA.CODCOLIGADA = 1
AND MTAREFA.IDPRJ = 21
UNION ALL
SELECT MTAREFA.CODTRF AS CODIGO,
(SELECT CMP.CODCMP
FROM MCMP CMP
WHERE CMP.CODCOLIGADA = MCMP.CODCOLIGADA
AND CMP.IDPRJ = MCMP.IDPRJ
AND CMP.IDCMP = MRECCMP.IDCMP) AS COMPOSICAO,
(SELECT CMP.CODUND
FROM MCMP CMP
WHERE CMP.CODCOLIGADA = MCMP.CODCOLIGADA
AND CMP.IDPRJ = MCMP.IDPRJ
AND CMP.IDCMP = MRECCMP.IDCMP) AS UNIDADE,
MCMP.PRODUCAOPORHORA AS PRODUCAO_EQUIPE,
'-' AS SERVICO,
MCMP.CODCMP + ' - ' + MCMP.DESCCMP AS INSUMO,
MCMP.CODUND AS UNIDADE_INSUMO,
CASE WHEN MRECCMP.GRUPODNER = 'B' THEN CONVERT(NVARCHAR, MISM.FATORK)
ELSE ''
END AS FATORK,
MRECCMP.GRUPODNER AS GRUPODNIT,
MRECCMP.DMT/10000 AS DMT,
CONVERT(NUMERIC(15,4),ROUND(MRECCMP.QUANTIDADE/10000,4)) AS QTDE,
CONVERT(NUMERIC(15,4),ROUND(MRECCMP.VALORUNIT,4)) AS PRECO_PRODUTIVO,
ISNULL(CONVERT(NUMERIC(15,4),ROUND(MRECCMP.PRECOIM PRODUTIVO,4)),0) AS PRECO_IMPRODUTIVO,
CONVERT(NUMERIC(15,4),ROUND(MRECCMP.VALORTOTAL,4)) AS VALOR_TOTAL,
CONVERT(NUMERIC(15,4),ROUND(MRECCMP.COEFICIENTEPRO DUTIVO/10000,4)) AS COEFICIENTEPRODUTIVO,
CONVERT(NUMERIC(15,4),ROUND(MRECCMP.COEFICIENTEIMP RODUTIVO/10000,4)) COEFICIENTEIMPRODUTIVO,
'SUBCOMPOSIÇAO' AS TABELA,
MCMP.EQUIPAMENTO AS CUSTO_HORARIO_DA_EQUIPE_MECANICA,
MCMP.MAOOBRA AS CUSTO_HORARIO_DA_MAO_DE_OBRA_SUPLEMENTAR,
MCMP.MATERIAL AS CUSTO_UNITARIO_DA_UTILIZACAO_DE_MARTERIAS,
MCMP.TRANSPORTE AS CUSTO_UNITARIO_DE_TRANSPORTE_DE_MATERIAS,
MCMP.VALORCOMLEI AS CUSTO_UNITARIO_DO_SERVICO,
MCMP.VALORBDI AS BDI,
MCMP.VALORTOTAL AS PRECO_UNITARIO_DO_SERVICO
FROM MCMP
INNER JOIN MRECCMP
LEFT JOIN MISM
ON MISM.CODCOLIGADA = MRECCMP.CODCOLIGADA
AND MISM.IDPRJ = MRECCMP.IDPRJ
AND MISM.IDISM = MRECCMP.IDISM
ON MRECCMP.CODCOLIGADA = MCMP.CODCOLIGADA
AND MRECCMP.IDPRJ = MCMP.IDPRJ
AND MRECCMP.IDCMPFILHA = MCMP.IDCMP
INNER JOIN MTAREFA
ON MTAREFA.CODCOLIGADA = MCMP.CODCOLIGADA
AND MTAREFA.IDPRJ = MCMP.IDPRJ
AND MTAREFA.IDCMP = MRECCMP.IDCMP
WHERE MCMP.CODCOLIGADA = 1
AND MCMP.IDPRJ = 21
ORDER BY CODIGO,
GRUPODNIT,
MISM.DESCISM
Sera que alguem pode me ajudar?
Respostas
-
Oi Jason,
Olhando melhor o SELECT, temos vários pontos de investigação.
- Pode haver uma coluna numérica em um SELECT e outra textual no outro SELECT
- As colunas que estão sendo convertidas para Numeric podem ter valores inválidos
- Algumas das colunas dos JOINs pode ser inteira e a outra textualNão é possível ajudá-lo sem ter os dados. É preciso investigar cada um dos casos e achar o dado que está fazendo a consulta dar o erro. O ISNUMERIC poderá ajudá-lo
[ ]s,
Gustavo Maia Aguiar
Blog: http://gustavomaiaaguiar.wordpress.com
Vídeos: http://www.youtube.com/user/gmasql
Classifique as respostas. O seu feedback é imprescindível- Sugerido como Resposta Eder Costa terça-feira, 23 de agosto de 2011 14:57
- Marcado como Resposta Heloisa Pires quinta-feira, 5 de abril de 2012 18:19
Todas as Respostas
-
Bom Dia,
Esse erro ocorre porque a coluna (em dos SELECTs) é textual e no outro é inteiro. Como o inteiro tem precedência, o otimizador tentará converter todos os textos em inteiro para fazer a junção e deve haver um texto que não pode ser convertido. Há duas soluções possíveis:
- Converte um dos campos para VARCHAR
- Examine qual dos SELECT retorna um texto que não pode ser convertido (use a função ISNUMERIC para descobrir)[ ]s,
Gustavo Maia Aguiar
Blog: http://gustavomaiaaguiar.wordpress.com
Vídeos: http://www.youtube.com/user/gmasql
Classifique as respostas. O seu feedback é imprescindível -
Opa, Gustavo quando execulto o select sem essa informações
MCMP.EQUIPAMENTO AS CUSTO_HORARIO_DA_EQUIPE_MECANICA,
MCMP.MAOOBRA AS CUSTO_HORARIO_DA_MAO_DE_OBRA_SUPLEMENTAR,
MCMP.MATERIAL AS CUSTO_UNITARIO_DA_UTILIZACAO_DE_MARTERIAS,
MCMP.TRANSPORTE AS CUSTO_UNITARIO_DE_TRANSPORTE_DE_MATERIAS,
MCMP.VALORCOMLEI AS CUSTO_UNITARIO_DO_SERVICO,
MCMP.VALORBDI AS BDI,
MCMP.VALORTOTAL AS PRECO_UNITARIO_DO_SERVICO,ele executa normal. e esses campos sao todos numericos numericos
-
Oi Jason,
Olhando melhor o SELECT, temos vários pontos de investigação.
- Pode haver uma coluna numérica em um SELECT e outra textual no outro SELECT
- As colunas que estão sendo convertidas para Numeric podem ter valores inválidos
- Algumas das colunas dos JOINs pode ser inteira e a outra textualNão é possível ajudá-lo sem ter os dados. É preciso investigar cada um dos casos e achar o dado que está fazendo a consulta dar o erro. O ISNUMERIC poderá ajudá-lo
[ ]s,
Gustavo Maia Aguiar
Blog: http://gustavomaiaaguiar.wordpress.com
Vídeos: http://www.youtube.com/user/gmasql
Classifique as respostas. O seu feedback é imprescindível- Sugerido como Resposta Eder Costa terça-feira, 23 de agosto de 2011 14:57
- Marcado como Resposta Heloisa Pires quinta-feira, 5 de abril de 2012 18:19
-