IIF - CASE

10/07/2007 - 09:10 por Wyoming | Informe spam
Buenas, soy muy novato en esto, a ver si alguien pudiera echarme una
mano.

Tengo hecha una consulta en Access cuyo código es el siguiente:

SELECT USU.USUNOM, USU.USUDES, cliente.ID_CLIENTE,
cliente.descripcion, [NOVEDADES ESO].ISBN, [NOVEDADES
ESO].descripcion, Sum(LINEAS.alumnos) AS USUARIOS, NIVEL.DescNivel AS
NIVEL_LIBRO, NIVEL_1.DescNivel AS NIVEL_ARGOS, IIf([NOVEDADES ESO]!
[ID_NIVEL]=[LINEAS]![ID_NIVEL],"VERDADERO","FALSO") AS COINCIDENCIA
FROM ((((LINEAS INNER JOIN [NOVEDADES ESO] ON LINEAS.ID_ISBN [NOVEDADES ESO].ID_ISBN) INNER JOIN cliente ON LINEAS.ID_CLIENTE cliente.ID_CLIENTE) INNER JOIN USU ON cliente.agente = USU.USUNOM)
INNER JOIN NIVEL ON [NOVEDADES ESO].ID_NIVEL = NIVEL.ID_NIVEL) INNER
JOIN NIVEL AS NIVEL_1 ON LINEAS.ID_NIVEL = NIVEL_1.ID_NIVEL
WHERE (((LINEAS.Definitivo)=-1))
GROUP BY USU.USUNOM, USU.USUDES, cliente.ID_CLIENTE,
cliente.descripcion, [NOVEDADES ESO].ISBN, [NOVEDADES
ESO].descripcion, NIVEL.DescNivel, NIVEL_1.DescNivel, IIf([NOVEDADES
ESO]![ID_NIVEL]=[LINEAS]![ID_NIVEL],"VERDADERO","FALSO");

Si os copiáis este código en la vista SQL de Access veréis que es una
consulta muy sencillita (yo es que si no la veo gráficamente no me
entero)

La parte que me interesa es la de la Condición: IIf([NOVEDADES ESO]!
[ID_NIVEL]=[LINEAS]![ID_NIVEL],"VERDADERO","FALSO") AS COINCIDENCIA

Según me han dicho, la Condición IIf de Access se puede hacer mediante
CASE en SQL pero por más que lo intento, siempre me da error.

El código en SQL, con el CASE incluido, lo he escrito de la siguiente
manera:

SELECT dbo.USU.USUNOM, dbo.USU.USUDES,
dbo.cliente.ID_CLIENTE, dbo.cliente.descripcion,
dbo.NOVEDADES_ESO.ISBN,
dbo.NOVEDADES_ESO.descripcion AS TÍTULO,
SUM(dbo.LINEAS.alumnos) AS ALUMNOS,
dbo.NIVEL.DescNivel AS NIVEL_LIBRO,
NIVEL1.DescNivel AS NIVEL_ARGOS
CASE WHEN dbo.NOVEDADES_ESO.ID_NIVEL = dbo.NIVEL.ID_NIVEL THEN
'VERDADERO' ELSE 'FALSO' END AS COINCIDENCIA
FROM dbo.cliente INNER JOIN
dbo.LINEAS ON
dbo.cliente.ID_CLIENTE = dbo.LINEAS.ID_CLIENTE INNER JOIN
dbo.NOVEDADES_ESO ON
dbo.LINEAS.ID_ISBN = dbo.NOVEDADES_ESO.ID_ISBN INNER JOIN
dbo.NIVEL NIVEL1 ON
dbo.LINEAS.ID_NIVEL = NIVEL1.ID_NIVEL INNER JOIN
dbo.USU ON
dbo.cliente.agente = dbo.USU.USUNOM INNER JOIN
dbo.NIVEL ON
dbo.NOVEDADES_ESO.ID_NIVEL = dbo.NIVEL.ID_NIVEL
WHERE (dbo.LINEAS.Definitivo = 1)
GROUP BY dbo.USU.USUNOM, dbo.USU.USUDES,
dbo.cliente.ID_CLIENTE, dbo.cliente.descripcion,
dbo.NOVEDADES_ESO.ISBN,
dbo.NOVEDADES_ESO.descripcion, dbo.NIVEL.DescNivel,
NIVEL1.DescNivel

Cuando le doy al botoncito de comprobar la sintaxis SQL me da el
siguiente error:
"El diseñador de consultas encontró un error de MS Design Tools: Error
de ADO: Sintaxis incorrecta cerca de la palabra clave 'CASE'. No se
puede preparar la instrucción o instrucciones. No se pudo completar
una acción aplazada".

¿qué estoy haciendo mal? (Lo único que necesito es saber cómo
transformar el IIf del SELECT y el del WHERE, con el resto no tengo
problemas)

Muchas gracias,

Jaime

Preguntas similare

Leer las respuestas

#1 Carlos M. Calvelo
10/07/2007 - 09:59 | Informe spam
Wyoming,

A ver... recorto todo lo sobra en tu post:

On 10 jul, 09:10, Wyoming wrote:
.

Tengo hecha una consulta en Access cuyo código es el siguiente:

... AS NIVEL_ARGOS, IIf

El código en SQL, con el CASE incluido, lo he escrito de la siguiente
manera:

... AS NIVEL_ARGOS CASE

... Sintaxis incorrecta cerca de la palabra clave 'CASE'.



Saludos,
Carlos
Respuesta Responder a este mensaje
#2 jcac
10/07/2007 - 16:05 | Informe spam
Creo que te falta una "coma", antes del case.

saludos
"Wyoming" escribió en el mensaje
news:
Buenas, soy muy novato en esto, a ver si alguien pudiera echarme una
mano.

Tengo hecha una consulta en Access cuyo código es el siguiente:

SELECT USU.USUNOM, USU.USUDES, cliente.ID_CLIENTE,
cliente.descripcion, [NOVEDADES ESO].ISBN, [NOVEDADES
ESO].descripcion, Sum(LINEAS.alumnos) AS USUARIOS, NIVEL.DescNivel AS
NIVEL_LIBRO, NIVEL_1.DescNivel AS NIVEL_ARGOS, IIf([NOVEDADES ESO]!
[ID_NIVEL]=[LINEAS]![ID_NIVEL],"VERDADERO","FALSO") AS COINCIDENCIA
FROM ((((LINEAS INNER JOIN [NOVEDADES ESO] ON LINEAS.ID_ISBN [NOVEDADES ESO].ID_ISBN) INNER JOIN cliente ON LINEAS.ID_CLIENTE cliente.ID_CLIENTE) INNER JOIN USU ON cliente.agente = USU.USUNOM)
INNER JOIN NIVEL ON [NOVEDADES ESO].ID_NIVEL = NIVEL.ID_NIVEL) INNER
JOIN NIVEL AS NIVEL_1 ON LINEAS.ID_NIVEL = NIVEL_1.ID_NIVEL
WHERE (((LINEAS.Definitivo)=-1))
GROUP BY USU.USUNOM, USU.USUDES, cliente.ID_CLIENTE,
cliente.descripcion, [NOVEDADES ESO].ISBN, [NOVEDADES
ESO].descripcion, NIVEL.DescNivel, NIVEL_1.DescNivel, IIf([NOVEDADES
ESO]![ID_NIVEL]=[LINEAS]![ID_NIVEL],"VERDADERO","FALSO");

Si os copiáis este código en la vista SQL de Access veréis que es una
consulta muy sencillita (yo es que si no la veo gráficamente no me
entero)

La parte que me interesa es la de la Condición: IIf([NOVEDADES ESO]!
[ID_NIVEL]=[LINEAS]![ID_NIVEL],"VERDADERO","FALSO") AS COINCIDENCIA

Según me han dicho, la Condición IIf de Access se puede hacer mediante
CASE en SQL pero por más que lo intento, siempre me da error.

El código en SQL, con el CASE incluido, lo he escrito de la siguiente
manera:

SELECT dbo.USU.USUNOM, dbo.USU.USUDES,
dbo.cliente.ID_CLIENTE, dbo.cliente.descripcion,
dbo.NOVEDADES_ESO.ISBN,
dbo.NOVEDADES_ESO.descripcion AS TÍTULO,
SUM(dbo.LINEAS.alumnos) AS ALUMNOS,
dbo.NIVEL.DescNivel AS NIVEL_LIBRO,
NIVEL1.DescNivel AS NIVEL_ARGOS
CASE WHEN dbo.NOVEDADES_ESO.ID_NIVEL = dbo.NIVEL.ID_NIVEL THEN
'VERDADERO' ELSE 'FALSO' END AS COINCIDENCIA
FROM dbo.cliente INNER JOIN
dbo.LINEAS ON
dbo.cliente.ID_CLIENTE = dbo.LINEAS.ID_CLIENTE INNER JOIN
dbo.NOVEDADES_ESO ON
dbo.LINEAS.ID_ISBN = dbo.NOVEDADES_ESO.ID_ISBN INNER JOIN
dbo.NIVEL NIVEL1 ON
dbo.LINEAS.ID_NIVEL = NIVEL1.ID_NIVEL INNER JOIN
dbo.USU ON
dbo.cliente.agente = dbo.USU.USUNOM INNER JOIN
dbo.NIVEL ON
dbo.NOVEDADES_ESO.ID_NIVEL = dbo.NIVEL.ID_NIVEL
WHERE (dbo.LINEAS.Definitivo = 1)
GROUP BY dbo.USU.USUNOM, dbo.USU.USUDES,
dbo.cliente.ID_CLIENTE, dbo.cliente.descripcion,
dbo.NOVEDADES_ESO.ISBN,
dbo.NOVEDADES_ESO.descripcion, dbo.NIVEL.DescNivel,
NIVEL1.DescNivel

Cuando le doy al botoncito de comprobar la sintaxis SQL me da el
siguiente error:
"El diseñador de consultas encontró un error de MS Design Tools: Error
de ADO: Sintaxis incorrecta cerca de la palabra clave 'CASE'. No se
puede preparar la instrucción o instrucciones. No se pudo completar
una acción aplazada".

¿qué estoy haciendo mal? (Lo único que necesito es saber cómo
transformar el IIf del SELECT y el del WHERE, con el resto no tengo
problemas)

Muchas gracias,

Jaime
Respuesta Responder a este mensaje
#3 Wyoming
11/07/2007 - 13:09 | Informe spam
Buenas, en efecto me faltaba la "coma".
Ahora ya me funciona, pero el problema es que me saca todos los
resultados y yo sólo quería que me devolviese los registros en los que
COINCIDENCIA = VERDADERO, que es como lo tengo en Access.
¿Tendría que añadirle alguna condición al WHERE?

Gracias de nuevo.

Te pongo cómo me ha quedado el código ahora:

SELECT USU.USUNOM, USU.USUDES, cliente.ID_CLIENTE,
cliente.descripcion, NOVEDADES_ESO.ISBN,
NOVEDADES_ESO.descripcion AS TÍTULO,
SUM(LINEAS.alumnos) AS ALUMNOS,
NIVEL1.DescNivel AS NIVEL_LIBRO,
NIVEL1.DescNivel AS NIVEL_ARGOS,
CASE WHEN dbo.NOVEDADES_ESO.ID_NIVEL = dbo.NIVEL.ID_NIVEL
THEN 'VERDADERO' ELSE 'FALSO' END AS COINCIDENCIA
FROM dbo.cliente INNER JOIN
dbo.LINEAS ON
dbo.cliente.ID_CLIENTE = dbo.LINEAS.ID_CLIENTE INNER JOIN
dbo.NOVEDADES_ESO ON
dbo.LINEAS.ID_ISBN = dbo.NOVEDADES_ESO.ID_ISBN INNER JOIN
dbo.NIVEL NIVEL1 ON
dbo.LINEAS.ID_NIVEL = NIVEL1.ID_NIVEL INNER JOIN
dbo.USU ON
dbo.cliente.agente = dbo.USU.USUNOM INNER JOIN
dbo.NIVEL ON
dbo.NOVEDADES_ESO.ID_NIVEL = NIVEL1.ID_NIVEL
WHERE (dbo.LINEAS.Definitivo = 1)
GROUP BY dbo.USU.USUNOM, dbo.USU.USUDES,
dbo.cliente.ID_CLIENTE, dbo.cliente.descripcion,
dbo.NOVEDADES_ESO.ISBN,
dbo.NOVEDADES_ESO.descripcion, NIVEL1.DescNivel,
NIVEL1.DescNivel, dbo.NOVEDADES_ESO.ID_NIVEL,
dbo.NIVEL.ID_NIVEL
Respuesta Responder a este mensaje
#4 jcac
11/07/2007 - 15:50 | Informe spam
Si lo que deseas es eso, entonces ponlo de esta manera:

SELECT USU.USUNOM, USU.USUDES, cliente.ID_CLIENTE,
cliente.descripcion, NOVEDADES_ESO.ISBN,
NOVEDADES_ESO.descripcion AS TÍTULO,
SUM(LINEAS.alumnos) AS ALUMNOS,
NIVEL1.DescNivel AS NIVEL_LIBRO,
NIVEL1.DescNivel AS NIVEL_ARGOS,
CASE WHEN dbo.NOVEDADES_ESO.ID_NIVEL = dbo.NIVEL.ID_NIVEL THEN
'VERDADERO' ELSE 'FALSO' END AS COINCIDENCIA
FROM dbo.cliente INNER JOIN
dbo.LINEAS ON
dbo.cliente.ID_CLIENTE = dbo.LINEAS.ID_CLIENTE INNER JOIN
dbo.NOVEDADES_ESO ON
dbo.LINEAS.ID_ISBN = dbo.NOVEDADES_ESO.ID_ISBN INNER JOIN
dbo.NIVEL NIVEL1 ON
dbo.LINEAS.ID_NIVEL = NIVEL1.ID_NIVEL INNER JOIN
dbo.USU ON
dbo.cliente.agente = dbo.USU.USUNOM INNER JOIN
dbo.NIVEL ON
dbo.NOVEDADES_ESO.ID_NIVEL = NIVEL1.ID_NIVEL
WHERE (dbo.LINEAS.Definitivo = 1)
and dbo.NOVEDADES_ESO.ID_NIVEL = dbo.NIVEL.ID_NIVEL -- ANADIR ESTA
FILA
GROUP BY dbo.USU.USUNOM, dbo.USU.USUDES,
dbo.cliente.ID_CLIENTE, dbo.cliente.descripcion,
dbo.NOVEDADES_ESO.ISBN,
dbo.NOVEDADES_ESO.descripcion, NIVEL1.DescNivel,
NIVEL1.DescNivel, dbo.NOVEDADES_ESO.ID_NIVEL,
dbo.NIVEL.ID_NIVEL

Pienso que en Access te esta devolviendo lo mismo que en SQL, solo que tal
vez estas utilizando un filtro en Access.

Espero que te sirva.

Saludos

"Wyoming" escribió en el mensaje
news:
Buenas, en efecto me faltaba la "coma".
Ahora ya me funciona, pero el problema es que me saca todos los
resultados y yo sólo quería que me devolviese los registros en los que
COINCIDENCIA = VERDADERO, que es como lo tengo en Access.
¿Tendría que añadirle alguna condición al WHERE?

Gracias de nuevo.

Te pongo cómo me ha quedado el código ahora:

SELECT USU.USUNOM, USU.USUDES, cliente.ID_CLIENTE,
cliente.descripcion, NOVEDADES_ESO.ISBN,
NOVEDADES_ESO.descripcion AS TÍTULO,
SUM(LINEAS.alumnos) AS ALUMNOS,
NIVEL1.DescNivel AS NIVEL_LIBRO,
NIVEL1.DescNivel AS NIVEL_ARGOS,
CASE WHEN dbo.NOVEDADES_ESO.ID_NIVEL = dbo.NIVEL.ID_NIVEL
THEN 'VERDADERO' ELSE 'FALSO' END AS COINCIDENCIA
FROM dbo.cliente INNER JOIN
dbo.LINEAS ON
dbo.cliente.ID_CLIENTE = dbo.LINEAS.ID_CLIENTE INNER JOIN
dbo.NOVEDADES_ESO ON
dbo.LINEAS.ID_ISBN = dbo.NOVEDADES_ESO.ID_ISBN INNER JOIN
dbo.NIVEL NIVEL1 ON
dbo.LINEAS.ID_NIVEL = NIVEL1.ID_NIVEL INNER JOIN
dbo.USU ON
dbo.cliente.agente = dbo.USU.USUNOM INNER JOIN
dbo.NIVEL ON
dbo.NOVEDADES_ESO.ID_NIVEL = NIVEL1.ID_NIVEL
WHERE (dbo.LINEAS.Definitivo = 1)
GROUP BY dbo.USU.USUNOM, dbo.USU.USUDES,
dbo.cliente.ID_CLIENTE, dbo.cliente.descripcion,
dbo.NOVEDADES_ESO.ISBN,
dbo.NOVEDADES_ESO.descripcion, NIVEL1.DescNivel,
NIVEL1.DescNivel, dbo.NOVEDADES_ESO.ID_NIVEL,
dbo.NIVEL.ID_NIVEL
Respuesta Responder a este mensaje
#5 Wyoming
12/07/2007 - 08:45 | Informe spam
On 11 jul, 15:50, "jcac" wrote:
Si lo que deseas es eso, entonces ponlo de esta manera:

SELECT USU.USUNOM, USU.USUDES, cliente.ID_CLIENTE,
cliente.descripcion, NOVEDADES_ESO.ISBN,
NOVEDADES_ESO.descripcion AS TÍTULO,
SUM(LINEAS.alumnos) AS ALUMNOS,
NIVEL1.DescNivel AS NIVEL_LIBRO,
NIVEL1.DescNivel AS NIVEL_ARGOS,
CASE WHEN dbo.NOVEDADES_ESO.ID_NIVEL = dbo.NIVEL.ID_NIVEL THEN
'VERDADERO' ELSE 'FALSO' END AS COINCIDENCIA
FROM dbo.cliente INNER JOIN
dbo.LINEAS ON
dbo.cliente.ID_CLIENTE = dbo.LINEAS.ID_CLIENTE INNER JOIN
dbo.NOVEDADES_ESO ON
dbo.LINEAS.ID_ISBN = dbo.NOVEDADES_ESO.ID_ISBN INNER JOIN
dbo.NIVEL NIVEL1 ON
dbo.LINEAS.ID_NIVEL = NIVEL1.ID_NIVEL INNER JOIN
dbo.USU ON
dbo.cliente.agente = dbo.USU.USUNOM INNER JOIN
dbo.NIVEL ON
dbo.NOVEDADES_ESO.ID_NIVEL = NIVEL1.ID_NIVEL
WHERE (dbo.LINEAS.Definitivo = 1)
and dbo.NOVEDADES_ESO.ID_NIVEL = dbo.NIVEL.ID_NIVEL -- ANADIR ESTA
FILA
GROUP BY dbo.USU.USUNOM, dbo.USU.USUDES,
dbo.cliente.ID_CLIENTE, dbo.cliente.descripcion,
dbo.NOVEDADES_ESO.ISBN,
dbo.NOVEDADES_ESO.descripcion, NIVEL1.DescNivel,
NIVEL1.DescNivel, dbo.NOVEDADES_ESO.ID_NIVEL,
dbo.NIVEL.ID_NIVEL

Pienso que en Access te esta devolviendo lo mismo que en SQL, solo que tal
vez estas utilizando un filtro en Access.

Espero que te sirva.

Saludos

"Wyoming" escribió en el mensajenews:
Buenas, en efecto me faltaba la "coma".
Ahora ya me funciona, pero el problema es que me saca todos los
resultados y yo sólo quería que me devolviese los registros en los que
COINCIDENCIA = VERDADERO, que es como lo tengo en Access.
¿Tendría que añadirle alguna condición al WHERE?

Gracias de nuevo.

Te pongo cómo me ha quedado el código ahora:

SELECT USU.USUNOM, USU.USUDES, cliente.ID_CLIENTE,
cliente.descripcion, NOVEDADES_ESO.ISBN,
NOVEDADES_ESO.descripcion AS TÍTULO,
SUM(LINEAS.alumnos) AS ALUMNOS,
NIVEL1.DescNivel AS NIVEL_LIBRO,
NIVEL1.DescNivel AS NIVEL_ARGOS,
CASE WHEN dbo.NOVEDADES_ESO.ID_NIVEL = dbo.NIVEL.ID_NIVEL
THEN 'VERDADERO' ELSE 'FALSO' END AS COINCIDENCIA
FROM dbo.cliente INNER JOIN
dbo.LINEAS ON
dbo.cliente.ID_CLIENTE = dbo.LINEAS.ID_CLIENTE INNER JOIN
dbo.NOVEDADES_ESO ON
dbo.LINEAS.ID_ISBN = dbo.NOVEDADES_ESO.ID_ISBN INNER JOIN
dbo.NIVEL NIVEL1 ON
dbo.LINEAS.ID_NIVEL = NIVEL1.ID_NIVEL INNER JOIN
dbo.USU ON
dbo.cliente.agente = dbo.USU.USUNOM INNER JOIN
dbo.NIVEL ON
dbo.NOVEDADES_ESO.ID_NIVEL = NIVEL1.ID_NIVEL
WHERE (dbo.LINEAS.Definitivo = 1)
GROUP BY dbo.USU.USUNOM, dbo.USU.USUDES,
dbo.cliente.ID_CLIENTE, dbo.cliente.descripcion,
dbo.NOVEDADES_ESO.ISBN,
dbo.NOVEDADES_ESO.descripcion, NIVEL1.DescNivel,
NIVEL1.DescNivel, dbo.NOVEDADES_ESO.ID_NIVEL,
dbo.NIVEL.ID_NIVEL



Ok. Muchas gracias, de verdad
email Siga el debate Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaRespuesta Tengo una respuesta
Search Busqueda sugerida