SQL - Problema con variable OR SQL

 
Vista:

Problema con variable OR SQL

Publicado por Andres (1 intervención) el 27/08/2014 16:50:57
Buenos dias.

Tengo un problema con un query, al solicitar los datos me manda el error siguiente:

Conversion failed when converting the varchar value '0R' to data type int.

Ya valide que mi DB no este con problemas y no manda errores detectados.

Este es el query que estoy usando:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
SELECT     MINVE01.NUM_MOV, MINVE01.CVE_ART, INVE01.DESCR,
                      CASE MINVE01.CVE_CPTO WHEN 51 THEN MINVE01.CANT * - 1 WHEN 56 THEN MINVE01.CANT * - 1 ELSE MINVE01.CANT END AS CANTIDAD,
                      MINVE01.CVE_CPTO, CONVERT(CHAR(12), MINVE01.FECHA_DOCU, 106) AS FECHA, MINVE01.PRECIO, CLIE01.CLASIFIC, CLIE01.CLAVE,
                      CLIE01.NOMBRE, VEND01.CVE_VEND,
                      CASE MINVE01.CVE_CPTO WHEN 51 THEN MINVE01.CANT * - 1 * MINVE01.PRECIO WHEN 56 THEN MINVE01.CANT * - 1 * MINVE01.PRECIO ELSE MINVE01.CANT
                       * MINVE01.PRECIO END AS IMPORTE, SUBSTRING(CLIE01.CLASIFIC, 4, 1) AS CANAL, SUBSTRING(CLIE01.CLASIFIC, 5, 1) AS POF, CONVERT(CHAR(3),
                      MINVE01.FECHA_DOCU, 109) AS MES, VEND01.NOMBRE AS VENDE, SUBSTRING(CLIE01.CLASIFIC, 1, 2) AS ESTADO,
                      CASE SUBSTRING(CLIE01.CLASIFIC, 1, 2)
                      WHEN 01 THEN 'Aguascalientes' WHEN 02 THEN 'Baja California Norte' WHEN 03 THEN 'Baja California Sur' WHEN 04 THEN 'Campeche' WHEN 05 THEN
                       'Coahuila' WHEN 06 THEN 'Colima' WHEN 07 THEN 'Chiapas' WHEN 08 THEN 'Chihuahua' WHEN 09 THEN 'Distrito Federal' WHEN 10 THEN 'Durango'
                       WHEN 11 THEN 'Guanajuato' WHEN 12 THEN 'Guerrero' WHEN 13 THEN 'Hidalgo' WHEN 14 THEN 'Jalisco' WHEN 15 THEN 'Estado de Mexico' WHEN
                       16 THEN 'Michoacan' WHEN 17 THEN 'Morelos' WHEN 18 THEN 'Nayarit' WHEN 19 THEN 'Nuevo leon' WHEN 20 THEN 'Oaxaca' WHEN 21 THEN 'Puebla'
                       WHEN 22 THEN 'Queretaro' WHEN 23 THEN 'Quintana Roo' WHEN 24 THEN 'San Luis Potosi' WHEN 25 THEN 'Sinaloa' WHEN 26 THEN 'Sonora' WHEN
                       27 THEN 'Tabasco' WHEN 28 THEN 'Tamaulipas' WHEN 29 THEN 'Tlaxcala' WHEN 30 THEN 'Veracruz' WHEN 31 THEN 'Yucatan' WHEN 32 THEN 'Zacatecas'
                       WHEN 33 THEN 'Extranjeros' ELSE 'x' END AS DESTADO, SUBSTRING(CLIE01.CLASIFIC, 4, 1) AS TIPOC, CASE SUBSTRING(CLIE01.CLASIFIC, 4, 1)
                      WHEN 'A' THEN 'Autoservicios' WHEN 'C' THEN 'Centros de Consumo' WHEN 'D' THEN 'Detallistas' WHEN 'E' THEN 'Otros' WHEN 'F' THEN 'Personas Fisicas'
                       WHEN 'H' THEN 'Hoteles' WHEN 'I' THEN 'Institucionales' WHEN 'M' THEN 'Mayoristas' WHEN 'O' THEN 'Otros' WHEN 'R' THEN 'Restaurantes' WHEN
                       'S' THEN 'Otros' WHEN 'V' THEN 'Departamentales' WHEN 'X' THEN 'Otros' ELSE 'x' END AS TICLIENTE,
                      CASE VEND01.CLASIFIC
WHEN 'A' THEN 'Autoservicios'
WHEN 'P' THEN 'Plaza'
WHEN 'D' THEN 'Directos Plaza'
ELSE 'Foraneo' END AS DCANAL,
 
INVE01.UNI_EMP AS UNIXCAJA,
                      CASE MINVE01.CVE_CPTO WHEN 51 THEN (MINVE01.CANT / INVE01.UNI_EMP)
                       ELSE (MINVE01.CANT / INVE01.UNI_EMP)* -1 END AS CAJAS, CONVERT(CHAR(4), MINVE01.FECHA_DOCU, 102) AS ANI
FROM         CLIE01 RIGHT OUTER JOIN
                      VEND01 RIGHT OUTER JOIN
                      MINVE01 ON VEND01.CVE_VEND = MINVE01.VEND ON CLIE01.CLAVE = MINVE01.CLAVE_CLPV LEFT OUTER JOIN
                      INVE01 ON MINVE01.CVE_ART = INVE01.CVE_ART
WHERE     ((MINVE01.FECHA_DOCU >= '2014-08-01') AND (MINVE01.FECHA_DOCU <= '2014-08-26') AND (MINVE01.CVE_CPTO = 4 OR
                      MINVE01.CVE_CPTO = 51 OR
					  MINVE01.CVE_CPTO = 56 OR
					  MINVE01.CVE_CPTO = 2) and INVE01.UNI_EMP > 0)
ORDER BY MINVE01.NUM_MOV


De antemano gracias por el apoyo
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
sin imagen de perfil
Val: 806
Bronce
Ha mantenido su posición en SQL (en relación al último mes)
Gráfica de SQL

Problema con variable OR SQL

Publicado por leonardo_josue (1173 intervenciones) el 27/08/2014 22:19:45
Hola Andres...

Con una consulta tan sencilla y tan bien explicada te debería ser fácil darte cuenta de que el error está en la línea 14...
(sarcasmo ¬¬)

El error es bastante claro en su descripción, y se trata de un problema de tipos de datos ya que se está intentando convertir un dato tipo caracter a un dato tipo entero, sin embargo con una consulta tan compleja resulta casi imposible decirte dónde está el error exactamente.

No nos dices con qué manejador de BD´s estás trabajando... por la descripción del error podría pensar que se trata de SQL Server, pero eso sólo Dios y tú lo sabes. Mucho cuidado cuando lances alguna pregunta, este dato es muy importante para poder darte una respuesta.

Ahora bien, volviendo al error, veo que haces algunas conversiones de tipo utilizando CONVERT, sin embargo las tres conversiones las haces a tipo CHAR, por lo tanto ahí no debe estar el problema, sin embargo, hay que recordar que existen algunas conversiones implícitas (es decir, que no se especifican en la consulta) que pueden ocasionar este tipo de error. Esto generalmente ocurre cuando haces operaciones matemáticas sobre campos tipo cadena. Observa este ejemplo de MYSQL para ver si se entiende a qué me refiero:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
mysql> select 1 + 2;
+-------+
| 1 + 2 |
+-------+
|     3 |
+-------+
1 row in set (0.03 sec)
 
mysql> select '1' + 2;
+---------+
| '1' + 2 |
+---------+
|       3 |
+---------+
1 row in set (0.01 sec)
 
mysql> select '1' + '2';
+-----------+
| '1' + '2' |
+-----------+
|         3 |
+-----------+
1 row in set (0.00 sec)
 
mysql> select 'a' + 'b';
+-----------+
| 'a' + 'b' |
+-----------+
|         0 |
+-----------+
1 row in set, 2 warnings (0.00 sec)
 
mysql> select 'a' + '1';
+-----------+
| 'a' + '1' |
+-----------+
|         1 |
+-----------+
1 row in set, 1 warning (0.00 sec)

Observa que en los tres primeros casos, NO IMPORTA SI COLOCO EL 1 Y/O EL 2 como número o como cadena, el resultado siempre es tres... inclusive colocando LOS DOS valores como cadena, se hace una conversión implícita para tratarlos como números, sin embargo en los dos últimos casos, al tratar de sumar una letra a un numero, el resultado es impredecible.

Creo que algo así está pasando en tu caso, te sugiero que sigas la estrategia de DIVIDE Y VENCERÁS, es decir, ve probando parte por parte de tu código para ver en donde está el problema... cuando determines si el error es con algún campo del SELECT, en el FROM o en el WHERE, entonces podrás revisar la información de la BD's y verificar qué está pasando...

y como sugerencia al margen, estás haciendo una serie de barbaridades que te van a dar dolores de cabeza... por ejemplo,

1. El CASE que haces para la entidad ES COMPLETAMENTE INUTIL... en lugar de eso, CREA UN CATÁLOGO DE ENTIDADES, si simplemente haces un JOIN, en lugar de hacer un CASE con más de 30 excepciones. y lo mismo con el campo DCANAL... si un campo de tu tabla TIENE ALGÚN SIGNIFICADO QUE SE TENGA QUE CODIFICAR TIENES QUE CREAR CATÁLOGOS.

2. Ojo con el uso excesivo de condiciones OR... si un campo puede tomar varios valores, es mejor utilizar IN.

1
2
3
4
5
MINVE01.CVE_CPTO = 4 OR MINVE01.CVE_CPTO = 51 OR MINVE01.CVE_CPTO = 56 OR 			  MINVE01.CVE_CPTO = 2
 
es lo mismo que
 
MINVE01.CVE_CPTO IN (4, 51, 56, 2)

3. Veo que haces un uso excesivo de SUBSTRING para extraer parte de una CLAVE... esto es también un error... Si tienes una clave COMPUESTA, es decir, que se forme por diferentes partes y cada parte tenga un significado especial, volvemos al punto 1, DEBES USAR CATÁLOGOS. Es más sencillo construir tu clave a partir de campos separados, con un CONCAT a tener que hacer un SUBSTRING cada vez que necesito un dato en específico.

Y hay muchas otras cosas que corregir, pero bueno, eso ya se convertiría en una clase de Diseño de BD's y no es el caso.

Saludos
Leo.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar