SQL - ¿Por que sql no me reconoce mi FROM en mi sentencia CASE?

 
Vista:
sin imagen de perfil

¿Por que sql no me reconoce mi FROM en mi sentencia CASE?

Publicado por Orybos (3 intervenciones) el 05/04/2018 20:34:58
Un saludo.

Estoy en un proyecto para mi curso de SQL y tengo un ejercicio donde debo conectarme a varias bases de datos y usar varias columnas de las bases de datos pare crear consultas dinámicas.

Ya tengo un código que no creo que le falle la lógica, (Creo que todos pueden leer el código y entender perfectamente que quiero mostrar), pero por alguna razón mi gestor de errores me indica que esperaba un FROM en mi primer sentencia CASE y no lo encuentra.

Cheque los parentesis y las comas pero no veo el error...

Este es el mensaje que me manda SQL:

Erro: Párrafo 4, No se encuentra palabra clave FROM.

Creo que moví mal algún paréntesis o me falto algo que no veo. Pero si alguien lo puede ver y darme guia se lo agradecería mucho.

Aqui el codigo:


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
40
41
42
43
44
45
46
47
48
49
SELECT *
FROM (SELECT d.usuario_autoriza gafete, 'Creditos' operacion, d.id_trabajador, d.num_prestamo
               CASE
                  WHEN (
						   (SELECT COUNT (dispo.num_prestamo)
                           FROM dba.dispoosiciones dispo
                           WHERE dispo.id_trabajador = d.id_trabajador
                           AND dispo.codigos_esp = 0
						   AND dispo.estado IN '1'
                           AND dispo.origen NOT IN 't'
                           AND dispo.codproducto IN (
													SELECT valor
													FROM dba.parametros_jts
													WHERE funcionalidad = 'REPORTE_TRANSACCIONES_ANALISTAS'
													AND parametro LIKE '%PRODUCTO_PROCESOS_CREDITO%'
													AND codigos_esp = 0
													)
							) > 1
						)
                THEN 'Segundo Credito'
                ELSE 'Primer Credito'
                END descripcion
                d.FECHAAUTORIZADO fecha, d.sucursalautoriza sucursal, d.codproducto, d.estado, d.Fecha_de_Solucion Fecha_Conclusion
				FROM dba.dispoosiciones d
 
		SELECT d.FECHAAUTORIZADO 'fecha', d.sucursalautoriza sucursal, d.codproducto, d.estado, d.Fecha_de_Solucion Fecha_Conclusion
        FROM dba.reportesolicitudes d
        WHERE d.codigos_esp = 0
        AND d.origen NOT IN 't'
        AND d.codproducto IN (
								SELECT valor
								FROM dba.parametros_jts
								WHERE funcionalidad = 'REPORTE_TRANSACCIONES_ANALISTAS'
								AND parametro LIKE '%PRODUCTO_PROCESOS_CREDITO%'
								AND codigos_esp = 0
							 )
	  )
WHERE d.fecha IN '16/03/2018'
AND Fecha_Conclusion IN '16/03/2018'
 
     UNION
 
SELECT d.usuario_autoriza gafete, 'Creditos' operacion, d.id_trabajador, d.num_prestamo,'Primer Credito' DESCRIPCION, d.FECHAAUTORIZADO, d.Fecha_de_Solucion, d.SUCURSALAUTORIZA, d.CODPRODUCTO, d.estado
FROM dba.dispoosiciones d
WHERE codproducto IN ('377','333','360','119','111')
AND fechaautorizado IN '16/03/2018'
AND	Fecha_de_Solucion IN '16/03/2018'
 
   ;

Cualquier duda, por favor no duden en decirla, la respondere tan rapido como pueda.

Gracias.
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

¿Por que sql no me reconoce mi FROM en mi sentencia CASE?

Publicado por leonardo_josue (1173 intervenciones) el 05/04/2018 21:44:10
Hola Orybos:

Veo varios errores en tu consulta:

1. En tu primer CASE-WHEN que tiene el alias DESCRIPCION, si quieres seguir seleccionando más campos debes de poner una COMA al final:

1
2
3
4
...
END descripcion --> aquí debes de poner una coma
d.FECHAAUTORIZADO fecha, d.sucursalautoriza sucursal, d.codproducto, d.estado, d.Fecha_de_Solucion Fecha_Conclusion
...

ya que si no pones coma, entonces SQL considera que ya no hay más campos en el SELECT y debería de comenzar la sección del FROM.

2. Después del FROM a disposiciones d estás haciendo un SELECT, esto también es un error de sintaxis:

1
2
3
4
...
FROM dba.dispoosiciones d
SELECT d.FECHAAUTORIZADO 'fecha', d.sucursalautoriza sucursal, d.codproducto, d.estado, d.Fecha_de_Solucion Fecha_Conclusion
...

3. No nos dices con qué motor de BD's estás trabajando, pero en SQL Estándar, cuando utilizas una subconsulta en el FROM, debes de colocarle un ALIAS a la subconsulta:

es decir

1
2
3
4
5
SELECT *
FROM
(SELECT * FROM tabla) T --> aquí debes de colocar tu alias
WHERE
...

Sin embargo no lo estás poniendo:

1
2
3
4
5
6
..
 ) -- Aquí deberías de poner un alias ya que este paréntesis cierra el paréntesis inicial del FROM
WHERE d.fecha IN '16/03/2018'
AND Fecha_Conclusion IN '16/03/2018'
UNION
...

4. En el WHERE estás haciendo uso del alias "d" para el campo FECHA, sin embargo este alias está dentro de la subconsulta por lo tanto NO TIENES ACCESO A ESTE ALIAS DESDE LA CONSULTA EXTERNA, sino que debes de usar justamente el alias que le asignas a la subconsulta:

1
2
3
4
SELECT *
FROM
(  SELECT campo1 FROM tabla alias_interno) alias_externo
WHERE alias_interno.campo1 = 'algo' --> ESTO NO PUEDES HACERLO:

entonces, tienes que hacerlo así:

1
2
3
4
SELECT *
FROM
(  SELECT campo1 FROM tabla alias_interno) alias_externo
WHERE alias_externo.campo1 = 'algo' --> DEBES DE USAR EL ALIAS QUE LE DAS A LA SUBCONSULTA

Finalmente, creo que podrías estar abusando de las subconsultas y esto puede afectar el rendimiento del servidor. igual y convendría que nos platicaras cómo es tu modelo y qué es lo que quieres hacer para ver si hay alguna otra forma de hacer la consulta sin tantas subconsultas.

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
2
Comentar
sin imagen de perfil

¿Por que sql no me reconoce mi FROM en mi sentencia CASE?

Publicado por Orybos (3 intervenciones) el 05/04/2018 22:20:50
Ok ya veo. (¡Que buena explicación, gracias!)

Entonces siguiendo la explicación quedaria algo asi mas o menos, ¿no es asi?:


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
40
41
42
43
44
45
46
47
48
49
SELECT *
FROM (SELECT d.usuario_autoriza gafete, 'Creditos' operacion, d.id_trabajador, d.num_prestamo
               CASE
                  WHEN (
						   (SELECT COUNT (dispo.num_prestamo)
                           FROM dba.dispoosiciones dispo
                           WHERE dispo.id_trabajador = Alias_del_primer_from.id_trabajador
                           AND dispo.codigos_esp = 0
						   AND dispo.estado IN '1'
                           AND dispo.origen NOT IN 't'
                           AND dispo.codproducto IN (
													SELECT valor
													FROM dba.parametros_jts
													WHERE funcionalidad = 'REPORTE_TRANSACCIONES_ANALISTAS'
													AND parametro LIKE '%PRODUCTO_PROCESOS_CREDITO%'
													AND codigos_esp = 0
													)
							) > 1
						)
                THEN 'Segundo Credito'
                ELSE 'Primer Credito'
                END descripcion,
                d.FECHAAUTORIZADO fecha, d.sucursalautoriza sucursal, d.codproducto, d.estado, d.Fecha_de_Solucion Fecha_Conclusion
				--FROM dba.dispoosiciones d
 
		SELECT d.FECHAAUTORIZADO fecha, d.sucursalautoriza sucursal, d.codproducto, d.estado, d.Fecha_de_Solucion Fecha_Conclusion
        FROM dba.reportesolicitudes d
        WHERE d.codigos_esp = 0
        AND d.origen NOT IN 't'
        AND d.codproducto IN (
								SELECT valor
								FROM dba.parametros_jts
								WHERE funcionalidad = 'REPORTE_TRANSACCIONES_ANALISTAS'
								AND parametro LIKE '%PRODUCTO_PROCESOS_CREDITO%'
								AND codigos_esp = 0
							 )
	  ) Alias_del_primer_from
WHERE d.fecha IN '16/03/2018'
AND Fecha_Conclusion IN '16/03/2018'
 
     UNION
 
SELECT d.usuario_autoriza gafete, 'Creditos' operacion, d.id_trabajador, d.num_prestamo,'Primer Credito' DESCRIPCION, d.FECHAAUTORIZADO, d.Fecha_de_Solucion, d.SUCURSALAUTORIZA, d.CODPRODUCTO, d.estado
FROM dba.dispoosiciones d
WHERE codproducto IN ('377','333','360','119','111')
AND fechaautorizado IN '16/03/2018'
AND	Fecha_de_Solucion IN '16/03/2018'
 
   ;
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