Foros del Web » Programando para Internet » ASP Clásico »

De varias consultas, hacer una sola

Estas en el tema de De varias consultas, hacer una sola en el foro de ASP Clásico en Foros del Web. Lo que voy a preguntar es un embole... ni sé cómo redactarlo para que se entienda. En un archivo MDB tengo 4 tablas (cada "->" ...
  #1 (permalink)  
Antiguo 13/07/2005, 12:03
Avatar de AlZuwaga
Colaborador
 
Fecha de Ingreso: febrero-2001
Ubicación: 34.517 S, 58.500 O
Mensajes: 14.550
Antigüedad: 23 años, 3 meses
Puntos: 535
De varias consultas, hacer una sola

Lo que voy a preguntar es un embole... ni sé cómo redactarlo para que se entienda.

En un archivo MDB tengo 4 tablas (cada "->" representa una relación 1 a varios)
Cursos -> Modulos -> Ediciones -> Matricula (y ésta se relaciona con la tabla Alumnos, pero aquí no interesa.. al menos por el momento)

En ese mismo archivo MDB tengo 3 consultas (consConfirmados, consPresentes y consCertificados) que se encargan de contar en la tabla "Matricula" cuantos alumnos "Confirmados", "Presentes" y que recibieron "Certificado" hay, respectivamente, por cada "Edicion" de cada "Modulo" de cada "Curso"

Las 3 consultas son las siguientes:

consConfirmados:
Cuenta cuántos alumnos que se han matriculado confirmaron la asistencia

Código:
SELECT Matricula.Id_Edicion, Count(Matricula.Conf) AS Confirmados
FROM Matricula
WHERE (((Matricula.Conf)=-1))
GROUP BY Matricula.Id_Edicion;


consPresentes:
Cuenta cuántos alumnos que se han matriculado realmente asistieron
Código:
SELECT Matricula.Id_Edicion, Count(Matricula.Presente) AS Presentes
FROM Matricula
WHERE (((Matricula.Presente)=-1))
GROUP BY Matricula.Id_Edicion;


consCertificados:
Cuenta cuántos alumnos que se han matriculado recibieron Certificado de Asistencia
Código:
SELECT Matricula.Id_Edicion, Count(Matricula.Certificado) AS Certificados
FROM Matricula
WHERE (((Matricula.Certificado)=-1))
GROUP BY Matricula.Id_Edicion;

Finalmente hay una ConsultaFinal que hace un conteo de los alumnos matriculados e incorpora los 3 conteos anteriores arrojados por las 3 consultas ya mencionadas:

ConsultaFinal:
Cita:
SELECT Cursos.Id_Curso, Cursos.Nom_Curso, Modulos.Id_Mod, Modulos.Nombre, Ediciones.Id_edicion, Ediciones.FechaIni, Ediciones.FechaFin, Count(Matricula.Id_Alumno) AS Matriculados, consConfirmados.Confirmados, consPresentes.Presentes, consCertificados.Certificados
FROM (Cursos LEFT JOIN Modulos ON Cursos.Id_Curso = Modulos.Id_Curso) LEFT JOIN ((((Ediciones LEFT JOIN consConfirmados ON Ediciones.Id_edicion = consConfirmados.Id_Edicion) LEFT JOIN consPresentes ON Ediciones.Id_edicion = consPresentes.Id_Edicion) LEFT JOIN consCertificados ON Ediciones.Id_edicion = consCertificados.Id_Edicion) LEFT JOIN Matricula ON Ediciones.Id_edicion = Matricula.Id_Edicion) ON Modulos.Id_Mod = Ediciones.Id_mod
GROUP BY Cursos.Id_Curso, Cursos.Nom_Curso, Modulos.Id_Mod, Modulos.Nombre, Ediciones.Id_edicion, Ediciones.FechaIni, Ediciones.FechaFin, consConfirmados.Confirmados, consPresentes.Presentes, consCertificados.Certificados
ORDER BY Cursos.Nom_Curso, Modulos.Nombre;

Ufff... ok, la idea es hacer sólo una sentencia SQL que me arroje el mismo resultado. Lo que no sé es cómo demonios hacerlo

¿Ideas? Gracias
__________________
...___...
  #2 (permalink)  
Antiguo 13/07/2005, 15:33
 
Fecha de Ingreso: junio-2005
Mensajes: 114
Antigüedad: 19 años
Puntos: 0
No sé si en access existe este comando, en Sql Server sí se puede

SELECT Matricula.Id_Edicion,
SUM (CASE WHEN Matricula.Presente=-1 THEN 1 ELSE 0 END ) AS Presentes,
SUM (CASE WHEN Matricula.Conf=-1 THEN 1 ELSE 0 END ) AS Confirmados,
SUM (CASE WHEN Matricula.Certificado=-1 THEN 1 ELSE 0 END ) AS Certificados
FROM Matricula
GROUP BY Matricula.Id_Edicion;

Qué tenés en el campo cuando no están confirmados ? 0 ?
Si es así, directamente podrías hacer un sum , y te va a dar los totales pero cambiados de signo.
Slds.
  #3 (permalink)  
Antiguo 14/07/2005, 07:59
 
Fecha de Ingreso: febrero-2005
Mensajes: 1.015
Antigüedad: 19 años, 4 meses
Puntos: 6
Interesante tópic.
  #4 (permalink)  
Antiguo 14/07/2005, 08:28
Avatar de Myakire
Colaborador
 
Fecha de Ingreso: enero-2002
Ubicación: Centro de la república
Mensajes: 8.849
Antigüedad: 22 años, 4 meses
Puntos: 146
Dudas preliminares:

1) El problema es que no deseas utilizar vistas predefinidas en ConsultaFinal .... ¿por qué no?
2) Deseas una consulta sin vistas pero ¿tampoco deseas subconsultas?
3) ¿El hecho de no usar las consultas predefinidas es por que vas a migrar a otra BD's?
5) Dependiendo de la respuesta de la pregunta 3 se desprenden:
5.1) Si la cosa es sql-server, supongo no habra problemas com DERIVEDTBL's, ¿o si?
4) ¿Puedes enviarme la BD con algunos registros para probar? Me da flojera en hacer una yo mismo

Saludos
  #5 (permalink)  
Antiguo 14/07/2005, 09:13
 
Fecha de Ingreso: junio-2005
Mensajes: 114
Antigüedad: 19 años
Puntos: 0
También podrías hacer :

SELECT Matricula.Id_Edicion, Count(Matricula.Conf) AS Confirmados, 0 AS Presentes, 0 AS Certificados
FROM Matricula
WHERE (((Matricula.Conf)=-1))
GROUP BY Matricula.Id_Edicion
UNION ALL
SELECT Matricula.Id_Edicion, 0 AS Confirmados, Count(Matricula.Presente) AS Presentes, 0 AS Certificados
FROM Matricula
WHERE (((Matricula.Presente)=-1))
GROUP BY Matricula.Id_Edicion
UNION ALL
SELECT Matricula.Id_Edicion, 0, 0, Count(Matricula.Certificado) AS Certificados
FROM Matricula
WHERE (((Matricula.Certificado)=-1))
GROUP BY Matricula.Id_Edicion;

Cómo pregunta Myakire ... cual es el objetivo ?
Slds.
  #6 (permalink)  
Antiguo 14/07/2005, 09:23
 
Fecha de Ingreso: abril-2004
Ubicación: México D.F.
Mensajes: 1.724
Antigüedad: 20 años, 1 mes
Puntos: 4
Utiliza shape command el objeto ADO.
  #7 (permalink)  
Antiguo 14/07/2005, 09:26
Avatar de Myakire
Colaborador
 
Fecha de Ingreso: enero-2002
Ubicación: Centro de la república
Mensajes: 8.849
Antigüedad: 22 años, 4 meses
Puntos: 146
Cita:
Cómo pregunta Myakire ... cual es el objetivo ?
No estar adivinando



Orharo ..... cambias de avatar como quien cambia de cal...cetines, jeje
  #8 (permalink)  
Antiguo 14/07/2005, 09:44
 
Fecha de Ingreso: abril-2004
Ubicación: México D.F.
Mensajes: 1.724
Antigüedad: 20 años, 1 mes
Puntos: 4
Cita:
Iniciado por Myakire



Orharo ..... cambias de avatar como quien cambia de cal...cetines, jeje
Bueno, ando haciendo algunas pruebas, disculpar las molestias jeje.......
Bueno sin más que agregar, dejo un video mio,jajaja cuando no tengo nada que hacer me voy a ver la tele.
  #9 (permalink)  
Antiguo 14/07/2005, 10:44
Avatar de AlZuwaga
Colaborador
 
Fecha de Ingreso: febrero-2001
Ubicación: 34.517 S, 58.500 O
Mensajes: 14.550
Antigüedad: 23 años, 3 meses
Puntos: 535
Respondo algunas cuestiones y me pongo a probar lo que me han pasado:

Cita:
Iniciado por Myakire
1) El problema es que no deseas utilizar vistas predefinidas en ConsultaFinal .... ¿por qué no?
2) Deseas una consulta sin vistas pero ¿tampoco deseas subconsultas?
3) ¿El hecho de no usar las consultas predefinidas es por que vas a migrar a otra BD's?
5) Dependiendo de la respuesta de la pregunta 3 se desprenden:
5.1) Si la cosa es sql-server, supongo no habra problemas com DERIVEDTBL's, ¿o si?
4) ¿Puedes enviarme la BD con algunos registros para probar? Me da flojera en hacer una yo mismo
1, 2 y 3) Efectivamente, no quiero usar vistas predefinidas (si subconsultas) porque tengo que contemplar la posibilidad (muy factible) que se migre a otra DB (que puede ser SWLServer o MySQL, no lo tienen definido)

5) Pues como dije puede ser MySQL (igual no tengo mucha experiencia con SQLServer y no sé que es DERIVEDTBL's)

El objetivo es mostrar de "un pantallazo" la mayor cantidad posible de información de los cursos.

Gracias

PD: Myakire, si me veo muy complicado te paso la BD (y gracias por el ofrecimiento)
__________________
...___...
  #10 (permalink)  
Antiguo 14/07/2005, 11:54
Avatar de Myakire
Colaborador
 
Fecha de Ingreso: enero-2002
Ubicación: Centro de la república
Mensajes: 8.849
Antigüedad: 22 años, 4 meses
Puntos: 146
Un DERIVEDTBL sería hacer algo como:

Código:
SELECT Cursos.Id_Curso, Cursos.Nom_Curso, Modulos.Id_Mod, Modulos.Nombre, Ediciones.Id_edicion, Ediciones.FechaIni, Ediciones.FechaFin, Count(Matricula.Id_Alumno) AS Matriculados, consConfirmados.Confirmados, consPresentes.Presentes, consCertificados.Certificados
FROM (Cursos LEFT JOIN Modulos ON Cursos.Id_Curso = Modulos.Id_Curso) LEFT JOIN ((((Ediciones LEFT JOIN (SELECT Matricula.Id_Edicion, Count(Matricula.Conf) AS Confirmados
FROM Matricula
WHERE (((Matricula.Conf)=-1))
GROUP BY Matricula.Id_Edicion) consConfirmados ON Ediciones.Id_edicion = consConfirmados.Id_Edicion) LEFT JOIN (SELECT Matricula.Id_Edicion, Count(Matricula.Presente) AS Presentes
FROM Matricula
WHERE (((Matricula.Presente)=-1))
GROUP BY Matricula.Id_Edicion) consPresentes ON Ediciones.Id_edicion = consPresentes.Id_Edicion) LEFT JOIN (SELECT Matricula.Id_Edicion, Count(Matricula.Certificado) AS Certificados
FROM Matricula
WHERE (((Matricula.Certificado)=-1))
GROUP BY Matricula.Id_Edicion) consCertificados ON Ediciones.Id_edicion = consCertificados.Id_Edicion) LEFT JOIN Matricula ON Ediciones.Id_edicion = Matricula.Id_Edicion) ON Modulos.Id_Mod = Ediciones.Id_mod
GROUP BY Cursos.Id_Curso, Cursos.Nom_Curso, Modulos.Id_Mod, Modulos.Nombre, Ediciones.Id_edicion, Ediciones.FechaIni, Ediciones.FechaFin, consConfirmados.Confirmados, consPresentes.Presentes, consCertificados.Certificados
ORDER BY Cursos.Nom_Curso, Modulos.Nombre;
Pero necesitaría hacer pruebas.........deja armo algo en access y te digo
  #11 (permalink)  
Antiguo 14/07/2005, 12:07
Avatar de AlZuwaga
Colaborador
 
Fecha de Ingreso: febrero-2001
Ubicación: 34.517 S, 58.500 O
Mensajes: 14.550
Antigüedad: 23 años, 3 meses
Puntos: 535
Pará, pará, paraaaaaa!!! No hagas nada!!
Ya me salió usando subconsultas

Código:
SELECT Cursos.Id_Curso, Cursos.Nom_Curso, Modulos.Id_Mod, Modulos.Nombre, Ediciones.Id_edicion, Ediciones.FechaIni, Ediciones.FechaFin, Count(Matricula.Id_Alumno) AS Matriculados, (SELECT Count(Matricula.Conf) AS Confirmados FROM Matricula WHERE (((Matricula.Conf)=-1)) AND Id_edicion = Ediciones.Id_edicion GROUP BY Matricula.Id_Edicion) AS Confirmados, (SELECT Count(Matricula.Presente) AS Presentes FROM Matricula WHERE (((Matricula.Presente)=-1)) AND Id_edicion = Ediciones.Id_edicion GROUP BY Matricula.Id_Edicion) AS Presentes,  (SELECT Count(Matricula.Certificado) AS Certificados FROM Matricula WHERE (((Matricula.Certificado)=-1)) AND Id_edicion = Ediciones.Id_edicion GROUP BY Matricula.Id_Edicion) AS Certificados
FROM (Cursos LEFT JOIN Modulos ON Cursos.Id_Curso=Modulos.Id_Curso) LEFT JOIN (Ediciones LEFT JOIN Matricula ON Ediciones.Id_edicion=Matricula.Id_Edicion) ON Modulos.Id_Mod=Ediciones.Id_mod
GROUP BY Cursos.Id_Curso, Cursos.Nom_Curso, Modulos.Id_Mod, Modulos.Nombre, Ediciones.Id_edicion, Ediciones.FechaIni, Ediciones.FechaFin
ORDER BY Cursos.Nom_Curso, Modulos.Nombre;
Ahora me resta entender por qué hoy si me funcionó y ayer no
Dejá que analizo qué hice diferente (además de dormir unas cuantas horas) y te comento
__________________
...___...
  #12 (permalink)  
Antiguo 14/07/2005, 12:31
Avatar de AlZuwaga
Colaborador
 
Fecha de Ingreso: febrero-2001
Ubicación: 34.517 S, 58.500 O
Mensajes: 14.550
Antigüedad: 23 años, 3 meses
Puntos: 535
Ya sé qué fue.

Coloco un ejemplo con una de las subconsultas que no funcionaba

Cita:
Iniciado por subconsulta mala
SELECT ... (SELECT Count(Matricula.Conf) AS Confirmados FROM Matricula WHERE (((Matricula.Conf)=-1)) GROUP BY Matricula.Id_Edicion) AS Confirmados ... WHERE ...

Y el mismo ejemplo con la subconsulta que finalmente funciona

Cita:
Iniciado por subconsulta buena
SELECT ... (SELECT Count(Matricula.Conf) AS Confirmados FROM Matricula WHERE (((Matricula.Conf)=-1)) AND Id_edicion = Ediciones.Id_edicion GROUP BY Matricula.Id_Edicion) AS Confirmados ... WHERE ...

Ahora les dejo para que jueguen a descubrir las diferencias
__________________
...___...
  #13 (permalink)  
Antiguo 14/07/2005, 13:07
Avatar de Myakire
Colaborador
 
Fecha de Ingreso: enero-2002
Ubicación: Centro de la república
Mensajes: 8.849
Antigüedad: 22 años, 4 meses
Puntos: 146
¡Vientos!
Lo bueno es que ni siquiera había abierto el Access
  #14 (permalink)  
Antiguo 14/07/2005, 14:20
Avatar de Neuron_376  
Fecha de Ingreso: abril-2005
Mensajes: 1.051
Antigüedad: 19 años, 2 meses
Puntos: 2
Hola!

AZ, no se si por ejemplo convenga mas algo como consultas separadas, porque tanta subconsulta me parece que lo que va a lograr es algo mas pesado, en algo como lo que propone edumferreyra, el riesgo es que otros motores no lo soporten, entonces creo que por eso no te gusto la opción, pero me parece mejor esa opción que las subconsultas.

Por otra parte, para que todo sea mas rapido, porque en lugar de varios campos para los casos que mencionas, no poner una especie de Estado, no Estatus, es decir Estado, donde:

Estado = 1 = Matriculado, todavia no confirmado
Estado = 2 = Matriculado, confirmado
Estado = 2 = Matriculado, confirmado, si asistio a clases.

Así la consulta corre sobre un solo campo, puedes tener un index en ese campo y listo, todo seria mas rapido.

Bueno, es una sugerencia, quien sabe ya en tus pruebas quizas las subconsultas corran muy bien...

Suerte!!
__________________
NeuronaNet.com... la idea correcta.
http://www.NeuronaNet.com
  #15 (permalink)  
Antiguo 14/07/2005, 15:52
Avatar de AlZuwaga
Colaborador
 
Fecha de Ingreso: febrero-2001
Ubicación: 34.517 S, 58.500 O
Mensajes: 14.550
Antigüedad: 23 años, 3 meses
Puntos: 535
Es que es una BD que ya está armada y con información de hace un tiempo. Sólo tengo que hacer que se pueda acceder a travez de un browser.
Y la verdad que no tiene un uso intensivo, por lo que no me preocupo mucho por la performance que pueda tener (además me lo quiero sacar de encima lo antes posible ;)

Gracias
__________________
...___...
  #16 (permalink)  
Antiguo 14/07/2005, 16:24
 
Fecha de Ingreso: marzo-2005
Mensajes: 1.418
Antigüedad: 19 años, 2 meses
Puntos: 9
En que post se mencionó el uso del Shape Command, que anexaron un link al mismo? Me estoy matando por encontrar el post, pero no doy con el. Si alguien se acuerda en cual fue que Orharo2003 mencionó este comando y puso el link respectivo, le agradecería mucho su ayuda.
Disculpas por poner esto en este post, pero justo vi que Orharo nuevamente lo mencionó, y lo aproveché para no generar un nuevo post con eso.
Saludos y gracias!.
__________________
Add, never Remove
  #17 (permalink)  
Antiguo 14/07/2005, 16:28
Avatar de u_goldman
Moderador
 
Fecha de Ingreso: enero-2002
Mensajes: 8.031
Antigüedad: 22 años, 5 meses
Puntos: 98
http://support.microsoft.com/kb/q189657/
__________________
"El hombre que ha empezado a vivir seriamente por dentro, empieza a vivir más sencillamente por fuera."
-- Ernest Hemingway
  #18 (permalink)  
Antiguo 14/07/2005, 16:44
 
Fecha de Ingreso: marzo-2005
Mensajes: 1.418
Antigüedad: 19 años, 2 meses
Puntos: 9
Muchas gracias U Goldman. Saludos!.
__________________
Add, never Remove
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 22:59.