Foros del Web » Programación para mayores de 30 ;) » Bases de Datos General » Mysql »

ejercicio de mysql

Estas en el tema de ejercicio de mysql en el foro de Mysql en Foros del Web. hola, estoy practicando con el siguiente ejercicio: Mostrar un resumen de los programas instalados indicando cuantos de ellos tienen licencia, considerar solo aquellos equipos adquiridos ...
  #1 (permalink)  
Antiguo 02/12/2009, 00:37
Avatar de Copia  
Fecha de Ingreso: noviembre-2009
Mensajes: 309
Antigüedad: 14 años, 5 meses
Puntos: 4
Pregunta ejercicio de mysql

hola, estoy practicando con el siguiente ejercicio:

Mostrar un resumen de los programas instalados indicando cuantos de ellos tienen licencia, considerar solo aquellos equipos adquiridos durante los años 2000 hasta el 2002, y cuyo estado actual todavia este vigente, ademas se debe de excluir a aquellos equipos que durante el año 2001 hayan tenido mas de 2 revisiones tecnicas en su plan de mantenimiento.

Para esta consulta tengo la siguientes relaciones:
http : // img34.imageshack.us/i/telmex.png/

la consulta que tengo es:
Código sql:
Ver original
  1. SELECT P.CodigoPrograma,P.Descripcion AS Programa,COUNT(EC.CodigoEquipoComputo) AS 'PCS',
  2.        SUM(PI.FlagTieneLicencia) AS 'Pcs con licencia'
  3. FROM EquipoComputo AS EC, ProgramasInstalados AS PI, Programas AS p
  4. WHERE (EC.CodigoEquipoComputo=PI.CodigoEquipoComputo) AND (PI.CodigoPrograma=P.CodigoPrograma)
  5.       AND (YEAR(EC.FechaAdquisicion) BETWEEN 2000 AND 2002) AND
  6.        (EC.CodigoEquipoComputo IN (SELECT SUM(PM.CodigoEquipoComputo)
  7.                                       FROM EquipoComputo AS EC,PlanMantenimiento AS PM
  8.                                       WHERE(EC.CodigoEquipoComputo=PM.CodigoEquipoComputo) AND
  9.                                            (YEAR(EC.FechaAdquisicion)=2001)
  10.                                       GROUP BY (PM.CodigoEquipoComputo)
  11.                                       HAVING SUM(PM.CodigoEquipoComputo)<2))
  12.  
  13. GROUP BY P.Descripcion;

he creado tambien la base de datos pero al ejecutar no me muestra resultado alguno, me puese a verificar los datos y si existe por lo menos 1 que se debe mostrar.

PD: no trato de hacer spam, pero la imagen lo pueden ver uniendo toda la direccion sin espacios.

Última edición por Copia; 03/12/2009 a las 01:26
  #2 (permalink)  
Antiguo 03/12/2009, 01:25
Avatar de Copia  
Fecha de Ingreso: noviembre-2009
Mensajes: 309
Antigüedad: 14 años, 5 meses
Puntos: 4
Respuesta: ejercicio de mysql

creo que he avanzado pero aun no me termina de correr la condicion que dice:

"ademas se debe de excluir a aquellos equipos que durante el año 2001 hayan tenido mas de 2 revisiones tecnicas en su plan de mantenimiento."

Tengo como dato a una pc con codigoprograma = 13 que esta 5 veces usado, uno se descarta porque es del 2005 no cumple condicion, tres pcs lo tienen instalado dos con licencia y una no, pero una de las tres codigoequipocomputo = 13 es del 2001 y tiene como 6 revisiones tecnica entonces se debe de borrar.

EL codigo es este:
Código Sql:
Ver original
  1. SELECT P.CodigoPrograma,P.Descripcion AS Programa,COUNT(EC.CodigoEquipoComputo) AS 'PCS',
  2.        SUM(PI.FlagTieneLicencia) AS 'Pcs con licencia'
  3. FROM EquipoComputo AS EC, ProgramasInstalados AS PI, Programas AS p
  4. WHERE (EC.CodigoEquipoComputo=PI.CodigoEquipoComputo) AND (PI.CodigoPrograma=P.CodigoPrograma)
  5.       AND (YEAR(EC.FechaAdquisicion) BETWEEN 2000 AND 2002) AND NOT
  6.        (EC.CodigoEquipoComputo IN (SELECT SUM(PM.CodigoEquipoComputo)
  7.                                       FROM EquipoComputo AS EC,PlanMantenimiento AS PM
  8.                                       WHERE(EC.CodigoEquipoComputo=PM.CodigoEquipoComputo) AND
  9.                                            (YEAR(EC.FechaAdquisicion)=2001)
  10.                                       GROUP BY (PM.CodigoEquipoComputo)
  11.                                       HAVING (SUM(PM.CodigoEquipoComputo)>2)))
  12.  
  13. GROUP BY P.Descripcion;
  #3 (permalink)  
Antiguo 03/12/2009, 03:27
serser
Invitado
 
Mensajes: n/a
Puntos:
Respuesta: ejercicio de mysql

Creo que aquí:

(year(EC.FechaAdquisicion)=2001)

dberías utilizar PM.FechaRevision en vez de EC.FechaAdquisicion, y negar la condición:

(year(PM.FechaRevision)!=2001)
  #4 (permalink)  
Antiguo 03/12/2009, 05:25
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 5 meses
Puntos: 2658
Respuesta: ejercicio de mysql

En tu ejemplo estás comparando el valor de EC.CodigoEquipoComputo, no con los códigos, sino con la suma del valor de los códigos que cumplen con la condición indicada.
Eso no tiene sentido.
Prueba:
Código sql:
Ver original
  1. SELECT
  2.   P.CodigoPrograma,P.Descripcion `Programa`,
  3.   COUNT(EC.CodigoEquipoComputo) `PCS`,
  4.   SUM(PI.FlagTieneLicencia) AS `Pcs con licencia`
  5. FROM
  6.   EquipoComputo EC
  7.   INNER JOIN ProgramasInstalados PI USING(CodigoEquipoComputo)
  8.   INNER JOIN Programas p USING(CodigoPrograma)
  9. WHERE
  10.       (YEAR(EC.FechaAdquisicion) BETWEEN 2000 AND 2002) AND
  11.       NOT (EC.CodigoEquipoComputo IN (SELECT
  12.                                          PM.CodigoEquipoComputo
  13.                                       FROM
  14.                                          EquipoComputo EC
  15.                                          INNER JOIN PlanMantenimiento PM USING(CodigoEquipoComputo)
  16.                                       WHERE
  17.                                          (YEAR(EC.FechaRevision)=2001)
  18.                                       GROUP BY (PM.CodigoEquipoComputo)
  19.                                       HAVING SUM(PM.CodigoEquipoComputo)>2
  20.                                      )
  21. GROUP BY P.Descripcion;

Simplifiqué un poco el código y le puse la relación donde tiene que ir (en el INNER JOIN y no en el WHERE).
Por lo demás, estoy de acuerdo con Serser.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #5 (permalink)  
Antiguo 03/12/2009, 11:15
Avatar de Copia  
Fecha de Ingreso: noviembre-2009
Mensajes: 309
Antigüedad: 14 años, 5 meses
Puntos: 4
Respuesta: ejercicio de mysql

gracias por las respuestas, han tenido toda la razon el prome era la forma como comparaba en la subseleccion.

el codigo final me quedo así:
Código sql:
Ver original
  1. SELECT
  2.   P.CodigoPrograma,P.Descripcion `Programa`,
  3.   COUNT(EC.CodigoEquipoComputo) `PCS`,
  4.   SUM(PI.FlagTieneLicencia) AS `Pcs con licencia`
  5. FROM
  6.   EquipoComputo EC
  7.   INNER JOIN ProgramasInstalados PI USING(CodigoEquipoComputo)
  8.   INNER JOIN Programas p USING(CodigoPrograma)
  9. WHERE
  10.       (YEAR(EC.FechaAdquisicion) BETWEEN 2000 AND 2002) AND
  11.       NOT (EC.CodigoEquipoComputo IN (SELECT
  12.                                          PM.CodigoEquipoComputo
  13.                                       FROM
  14.                                          PlanMantenimiento PM
  15.                                       WHERE
  16.                                          (YEAR(PM.FechaRevision)=2001)
  17.                                       GROUP BY (PM.CodigoEquipoComputo)
  18.                                       HAVING SUM(PM.CodigoEquipoComputo)>2
  19.                                      ))
  20. GROUP BY P .Descripcion
  21. ORDER BY P.CodigoPrograma;

No se si pueden explicarme un poco la relacion que hacen con inner join, los entiendo en parte pero ese using que ponen usa exclusivamente un campo de la tabla?. Tambien vi que para renombrar no uso as.. como en esto: ProgramasInstalados PI

SI tienen ahi algo que me ayude a comprender los inner Join :D

saludos y gracias
  #6 (permalink)  
Antiguo 03/12/2009, 11:29
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 5 meses
Puntos: 2658
Respuesta: ejercicio de mysql

1. Los INNER JOIN realizan una junta natural entre dos tablas, pero requieren especificar cuáles campos se van a relacionar, y sólo devuelve aquellos registros donde se cumple la relación. Los campos se deben especificar con la cláusula ON, si los campos tienen nombre diferente en cada tabla, o se pueden especificar con USING(campos), si en ambas tablas tiene el mismo nombre.
El USING() es más rápido que el ON, por lo que yo lo suelo preferir; además no requiere que sea un sólo campos. En realidad dentro de los paréntesis pueden ir todos los campos que se desea que se consideren en el JOIN al mismo tiempo. Eso si: todos los campos listados deben existir con esos nombres en ambas tablas.

2. La cláusula AS dejó de ser obligatoria hace años. Los DBMS la aceptan por cuestiones de compatibilidad con códigos viejos, pero ya no es necesario ponerla. El MySQL reconoce como alias cualquier palabra que siga a continuación del nombre de una base, una tabla o un campo.

Lo mejor que puedes hacer para comprender los INNER JOIN es leer el manual y ver algo más de SQL:
13.2.7.1. Sintaxis de JOIN

JOIN en SQL
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #7 (permalink)  
Antiguo 03/12/2009, 11:43
Avatar de Copia  
Fecha de Ingreso: noviembre-2009
Mensajes: 309
Antigüedad: 14 años, 5 meses
Puntos: 4
Respuesta: ejercicio de mysql

me pongo a leer lo que me dejaste.

Con la misma relacion me piden que haga lo siguiente:

Implementar un procedimiento almacenado para reubicar una pc donde se ingrese el CodigoEquipoComputo y la nueva ubucacion como condicion se tiene que:

1.- se debe almacenar en el campo observaciones de la pc, la antigua ubicacion.
2.- no se puede cambiar la ubicacion si el equipo esta de baja, el codigo del estado que da de baja a una pc es 2.

Entonces arme lo siguiente:

Código sql:
Ver original
  1. CREATE PROCEDURE Sp_ReUbicar(xCodigoEquipoComputo VARCHAR(10),
  2.                                        xCodigoUbicacion VARCHAR(8))
  3. BEGIN
  4.     DECLARE ubicacionAnterior VARCHAR(8);
  5.     SET ubicacionAnterior = (SELECT EC.CodigoUbiacion
  6.                              FROM EquipoComputo EC
  7.                              WHERE(EC.CodigoEquipoComputo=xCodigoEquipoComputo));
  8.  
  9.         IF ((SELECT estado FROM EquipoComputo
  10.              WHERE (CodigoEquipoComputo=xCodigoEquipoComputo) <> 2) THEN
  11.  
  12.              UPDATE EquipoComputo SET CodigoUbicacion=xCodigoUbicacion,
  13.                                       Observacion=ubicacionAnterior
  14.              WHERE  CodigoEquipoComputo=xCodigoEquipoComputo;
  15.     END IF
  16. END

pero me sale error al ejecutar el sql con el administrator
  #8 (permalink)  
Antiguo 03/12/2009, 14:11
serser
Invitado
 
Mensajes: n/a
Puntos:
Respuesta: ejercicio de mysql

Creo que te sobra un paréntesis de apertura en el IF y te falta cerrar el END IF con ;
  #9 (permalink)  
Antiguo 03/12/2009, 23:40
Avatar de Copia  
Fecha de Ingreso: noviembre-2009
Mensajes: 309
Antigüedad: 14 años, 5 meses
Puntos: 4
Respuesta: ejercicio de mysql

tiene usted razon, faltaba solo eso para que se compile el procedimiento en resumen me quedo este codigo:

Código mysql:
Ver original
  1. CREATE DEFINER=`root`@`localhost` PROCEDURE `Sp_ReUbicar`(xCodigoEquipoComputo varchar(10),
  2.                                        xCodigoUbicacion varchar(8))
  3.     declare ubicacionAnterior varchar(8);
  4.     set ubicacionAnterior = (select EC.CodigoUbiacion
  5.                              FROM EquipoComputo EC
  6.                              where(EC.CodigoEquipoComputo=xCodigoEquipoComputo));
  7.  
  8.         if ((select estado FROM EquipoComputo
  9.              where (CodigoEquipoComputo=xCodigoEquipoComputo)) <> 2) then
  10.  
  11.              update EquipoComputo set CodigoUbicacion=xCodigoUbicacion,
  12.                                       Observacion=ubicacionAnterior
  13.              where  CodigoEquipoComputo=xCodigoEquipoComputo;
  14.     end if;

Pero lo e ejecutado asi: CALL Sp_ReUbicar(4,7);

y me da este error: Unknown column 'EC.CodigoUbiacion' in 'field list'

e visto los campos y estan todos bien?? cual podria ser esta vez el error?
  #10 (permalink)  
Antiguo 04/12/2009, 05:06
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 5 meses
Puntos: 2658
Respuesta: ejercicio de mysql

- Verifica que la tabla EQUIPOCOMPUTO tenga un campo denominado `CodigoUbicacion`.
- Si lo tiene, probemos suprimir los alias que no se necesitan:
Código sql:
Ver original
  1. CREATE DEFINER=`root`@`localhost` PROCEDURE `Sp_ReUbicar`
  2.   (IN xCodigoEquipoComputo VARCHAR(10),
  3.   IN xCodigoUbicacion VARCHAR(8))
  4. BEGIN
  5.   DECLARE ubicacionAnterior VARCHAR(8);
  6.   SET ubicacionAnterior = (SELECT CodigoUbiacion
  7.                            FROM EquipoComputo
  8.                            WHERE CodigoEquipoComputo=xCodigoEquipoComputo);
  9.   IF(SELECT estado FROM EquipoComputo WHERE CodigoEquipoComputo = xCodigoEquipoComputo) <> 2) THEN
  10.     UPDATE EquipoComputo
  11.       SET
  12.           CodigoUbicacion = xCodigoUbicacion,
  13.           Observacion = ubicacionAnterior
  14.     WHERE CodigoEquipoComputo = xCodigoEquipoComputo;
  15.   END IF;
  16. END

Además, ten en cuenta que en MySQL se debe indicar si los parámetros de un SP son de entrada (IN), salida (OUT) o entrada-salida (INOUT). Si no los pones, solamente serán IN.
Yo sugiero ponerlo aunque sea redundante para evitar confusiones y ceñirse mejor al estándar de sintaxis.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #11 (permalink)  
Antiguo 04/12/2009, 05:40
serser
Invitado
 
Mensajes: n/a
Puntos:
Respuesta: ejercicio de mysql

Creo que me ha pasado lo mismo que te está pasando a tí, Copia.

He revisado el código varias veces sin encontrar ningún error hasta que me he parado detenidamente y me he dado cuenta de esto:

(SELECT CodigoUbiacion...

¡Te falta una c entre la 'i' y la 'a'!
  #12 (permalink)  
Antiguo 04/12/2009, 06:41
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 5 meses
Puntos: 2658
Respuesta: ejercicio de mysql

Eso se me pasó....
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #13 (permalink)  
Antiguo 05/12/2009, 00:47
Avatar de Copia  
Fecha de Ingreso: noviembre-2009
Mensajes: 309
Antigüedad: 14 años, 5 meses
Puntos: 4
Respuesta: ejercicio de mysql

o no... no puede ser, esa clase de errores dan que ahcer.

Gracias por la ayuda pero aun no me corre como debe, este es el resultado tras:
call(4,7)

codigoEquipoComputo
4
Codigoubicacion
4 //no modifico
observacion
servt // no puso lo que debia

no se ha modificado nada, mira por curiosidad el equipo 7 pero esta igual.
  #14 (permalink)  
Antiguo 05/12/2009, 01:27
serser
Invitado
 
Mensajes: n/a
Puntos:
Respuesta: ejercicio de mysql

Copia, te puedo decir que el procedimiento funciona porque ayer me puse a probarlo por curiosidad. Fíjate bien a ver si el codigoEquipoComputo 4 tiene un estado = 2 ???.

De todas formas de dejo el código que me funciona:

Código:
CREATE PROCEDURE Sp_ReUbicar(IN xCodigoEquipoComputo VARCHAR(10), IN xCodigoUbicacion VARCHAR(8))
BEGIN
   DECLARE ubicacionAnterior VARCHAR(8);
   SET ubicacionAnterior = (SELECT CodigoUbicacion
                            FROM EquipoComputo
                            WHERE(CodigoEquipoComputo=xCodigoEquipoComputo));

       IF ((SELECT estado FROM EquipoComputo
            WHERE (CodigoEquipoComputo=xCodigoEquipoComputo)) <> 2) THEN

            UPDATE EquipoComputo SET CodigoUbicacion=xCodigoUbicacion,
                                     Observacion=ubicacionAnterior
            WHERE  CodigoEquipoComputo=xCodigoEquipoComputo;
   END IF;
END
  #15 (permalink)  
Antiguo 06/12/2009, 00:08
Avatar de Copia  
Fecha de Ingreso: noviembre-2009
Mensajes: 309
Antigüedad: 14 años, 5 meses
Puntos: 4
Respuesta: ejercicio de mysql

hola.. pues te dejo la base de datos con la que estoy trabajando.. para que vea, cuando lei su comentario queria que me coma la tierra porque no me habia fijado si el codigo del estado era 2, por suerte no fue asi, y probe con otros.

aca esta: http : // w w w .megaupload.com/ ?d=50X80849
  #16 (permalink)  
Antiguo 06/12/2009, 09:13
serser
Invitado
 
Mensajes: n/a
Puntos:
Respuesta: ejercicio de mysql

El fallo está en que llamas al procedimiento con parámetros numéricos y los tipos a los que hacen referencia son VARCHAR. Para que funcione tienes que porner:

CALL Sp_ReUbicar('04',7);

El 7 lo acepta tal cual porque en codigoubicacion no tienes ceros delante. Por eso es mejor llamarlo así siempre:

CALL Sp_ReUbicar('04','7');
  #17 (permalink)  
Antiguo 06/12/2009, 23:41
Avatar de Copia  
Fecha de Ingreso: noviembre-2009
Mensajes: 309
Antigüedad: 14 años, 5 meses
Puntos: 4
Respuesta: ejercicio de mysql

sierto tienes razon, gracias amigo
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 21:21.