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

consultilla...

Estas en el tema de consultilla... en el foro de Bases de Datos General en Foros del Web. A ver... tengo esto: tabla1 ===== id____empresa -------------------- 1____telefónica 2____Carrefour 3____Prisa tabla2 ==== id____facturacion____ejercicio --------------------------------------- 1_____150__________2008 1_____225__________2009 3_____75___________2009 La consulta debe sacar todas las empresa ...
  #1 (permalink)  
Antiguo 24/05/2011, 06:14
Avatar de arprielo  
Fecha de Ingreso: octubre-2007
Mensajes: 67
Antigüedad: 17 años, 1 mes
Puntos: 0
consultilla...

A ver... tengo esto:

tabla1
=====
id____empresa
--------------------
1____telefónica
2____Carrefour
3____Prisa

tabla2
====
id____facturacion____ejercicio
---------------------------------------
1_____150__________2008
1_____225__________2009
3_____75___________2009

La consulta debe sacar todas las empresa de la tabla1 tanto tengan registros ó no en la tabla 2 con facturación del 2009
El resultado deseado seria:

empresa____facturación
-------------------------------
telefónica______225
carrefour_______
Prisa__________75

Gracias de antemano. Un saludo
__________________
Viva Linux! viva Ubuntu...!
  #2 (permalink)  
Antiguo 24/05/2011, 08:11
Avatar de Heimish2000  
Fecha de Ingreso: enero-2011
Ubicación: Madrid
Mensajes: 844
Antigüedad: 13 años, 10 meses
Puntos: 89
Respuesta: consultilla...

¿Que no sabes hacer? ¿Que queries has probado? Con un LEFT JOIN es una consulta super sencilla
  #3 (permalink)  
Antiguo 24/05/2011, 08:26
Avatar de arprielo  
Fecha de Ingreso: octubre-2007
Mensajes: 67
Antigüedad: 17 años, 1 mes
Puntos: 0
Respuesta: consultilla...

Si, pero al a ver una condición el la tabla2 no sirve solo el left join. Ya lo prove y no salia.
__________________
Viva Linux! viva Ubuntu...!
  #4 (permalink)  
Antiguo 24/05/2011, 08:36
Avatar de Heimish2000  
Fecha de Ingreso: enero-2011
Ubicación: Madrid
Mensajes: 844
Antigüedad: 13 años, 10 meses
Puntos: 89
Respuesta: consultilla...

Que probaste
  #5 (permalink)  
Antiguo 24/05/2011, 08:47
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 17 años
Puntos: 2658
Respuesta: consultilla...

Código MySQL:
Ver original
  1. SELECT empresa, IFNULL(SUM(facturacion), 0) Facturacion
  2. FROM tabla1 T1 LEFT JOIN tabla2 T2 ON T1.id = T2.id
  3. WHERE T2.ejercicio = 2009 OR T2.ejercicio IS NULL
  4. GROUP BY T1.id;
No estoy seguro de si esto es necesario:
Cita:
OR T2.ejercicio IS NULL
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #6 (permalink)  
Antiguo 24/05/2011, 08:52
Avatar de arprielo  
Fecha de Ingreso: octubre-2007
Mensajes: 67
Antigüedad: 17 años, 1 mes
Puntos: 0
Respuesta: consultilla...

SELECT Tabla1.empresa, Tabla2.facturacion
FROM Tabla1 LEFT JOIN Tabla2 ON Tabla1.id = Tabla2.id_t1
WHERE (((Tabla2.ejercicio)=2009))

y me sale esto:
empresa____facturación
-------------------------------
telefónica______225
Prisa__________75


Faltaria la empresa carrefour.
__________________
Viva Linux! viva Ubuntu...!
  #7 (permalink)  
Antiguo 24/05/2011, 08:56
Avatar de Heimish2000  
Fecha de Ingreso: enero-2011
Ubicación: Madrid
Mensajes: 844
Antigüedad: 13 años, 10 meses
Puntos: 89
Respuesta: consultilla...

Prueba esta query y me cuentas:

Código MySQL:
Ver original
  1. SELECT t1.enmpresa, t2.facturacion
  2. FROM Tabla1 t1
  3. (SELECT id_t1, facturacion
  4. FROM Tabla2
  5. WHERE ejercicio = 2009) AS t2 ON
  6. t1.id = t2.id_t1
  #8 (permalink)  
Antiguo 24/05/2011, 09:12
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 17 años
Puntos: 2658
Respuesta: consultilla...

Es que no pusiste el IS NULL:
Código MySQL:
Ver original
  1. mysql> USE TEST;
  2. Database changed
  3. mysql> DROP TABLE IF EXISTS tabla1, tabla2;
  4. Query OK, 0 rows affected (0.12 sec)
  5.  
  6. mysql> CREATE TABLE tabla1
  7.     ->   (id INT,
  8.     ->   empresa VARCHAR(200));
  9. Query OK, 0 rows affected (0.04 sec)
  10.  
  11. mysql> CREATE TABLE tabla2(
  12.     ->   id INT,
  13.     ->   facturacion INT, ejercicio SMALLINT);
  14. Query OK, 0 rows affected (0.01 sec)
  15.  
  16. mysql> INSERT INTO tabla1
  17.     -> VALUES(1, 'Telefonica'), (2, 'Carrefour'), (3, 'Prisa');
  18. Query OK, 3 rows affected (0.00 sec)
  19. Records: 3  Duplicates: 0  Warnings: 0
  20.  
  21. mysql> INSERT INTO tabla2
  22.     -> VALUES(1, 150, 2008), (1,225,2009),(3,75,2009);
  23. Query OK, 3 rows affected (0.00 sec)
  24. Records: 3  Duplicates: 0  Warnings: 0
  25.  
  26. mysql> SELECT empresa, IFNULL(SUM(facturacion), 0) Facturacion
  27.     -> FROM tabla1 T1 LEFT JOIN tabla2 T2 ON T1.id = T2.id
  28.     -> WHERE T2.ejercicio = 2009 OR T2.ejercicio IS NULL
  29.     -> GROUP BY T1.id;
  30. +------------+-------------+
  31. | empresa    | Facturacion |
  32. +------------+-------------+
  33. | Telefonica |         225 |
  34. | Carrefour  |           0 |
  35. | Prisa      |          75 |
  36. +------------+-------------+
  37. 3 rows in set (0.00 sec)
Lo que yo dije era que no estaba seguro, no que no debía ir (no lo había probado).
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #9 (permalink)  
Antiguo 24/05/2011, 09:20
Avatar de Heimish2000  
Fecha de Ingreso: enero-2011
Ubicación: Madrid
Mensajes: 844
Antigüedad: 13 años, 10 meses
Puntos: 89
Respuesta: consultilla...

gnzsoloyo, con is null no funcionaría correctamente en todos los casos (aunque en el ejemplo si)

Si Carrefour tiene un registro en la tabla2 con periodo 2008, pero no con 2009, en tu query no saldría y él quiere que salgan todas las empresas (si no me equivoco)
  #10 (permalink)  
Antiguo 24/05/2011, 09: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: 17 años
Puntos: 2658
Respuesta: consultilla...

Lo único que necesitarías es poner un TRUE donde va el año:
Código MySQL:
Ver original
  1. mysql> SELECT empresa, IFNULL(SUM(facturacion), 0) Facturacion
  2.     -> FROM tabla1 T1 LEFT JOIN tabla2 T2 ON T1.id = T2.id
  3.     -> WHERE TRUE OR T2.ejercicio IS NULL
  4.     -> GROUP BY T1.id;
  5. +------------+-------------+
  6. | empresa    | Facturacion |
  7. +------------+-------------+
  8. | Telefonica |         375 |
  9. | Carrefour  |           0 |
  10. | Prisa      |          75 |
  11. +------------+-------------+
  12. 3 rows in set (0.00 sec)
O bien, agrupar por año:
Código MySQL:
Ver original
  1. mysql> SELECT empresa, IFNULL(SUM(facturacion), 0) Facturacion, IFNULL(Ejercicio, '') Ejercicio
  2.     -> FROM tabla1 T1 LEFT JOIN tabla2 T2 ON T1.id = T2.id
  3.     -> GROUP BY T1.id, ejercicio;
  4. +------------+-------------+-----------+
  5. | empresa    | Facturacion | Ejercicio |
  6. +------------+-------------+-----------+
  7. | Telefonica |         150 | 2008      |
  8. | Telefonica |         225 | 2009      |
  9. | Carrefour  |           0 |           |
  10. | Prisa      |          75 | 2009      |
  11. +------------+-------------+-----------+
  12. 4 rows in set, 1 warning (0.00 sec)
__________________
¿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 24/05/2011, 09:29
Avatar de Heimish2000  
Fecha de Ingreso: enero-2011
Ubicación: Madrid
Mensajes: 844
Antigüedad: 13 años, 10 meses
Puntos: 89
Respuesta: consultilla...

Si agrupas por el año, te están saliendo las de todos los años, no sólo las del 2009 (como se puede ver, que tienes datos de los dos años)

En tu primera consulta estás sumando la de todos los años, el sólo quiere las del 2009
  #12 (permalink)  
Antiguo 24/05/2011, 09:59
Avatar de Heimish2000  
Fecha de Ingreso: enero-2011
Ubicación: Madrid
Mensajes: 844
Antigüedad: 13 años, 10 meses
Puntos: 89
Respuesta: consultilla...

A que si insertas un registro nuevo en la tabla2 que sea

INSERT INTO tabla2 VALUES(2, 280, 2008);

Y ejecutas tu sentencia, Carrefour no saldrá porque al hacer el JOIN el periodo no será 2009 ni NULL, con lo que tu consulta no vale en todos los casos.

Edito para decir que gnzsoloyo tenía un post que ha borrado y sobre el era mi respuesta
  #13 (permalink)  
Antiguo 24/05/2011, 10:02
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 17 años
Puntos: 2658
Respuesta: consultilla...

Afinemos un poco entonces:
Código MySQL:
Ver original
  1. mysql> INSERT INTO tabla2
  2.     -> VALUES(2, 154, 2008);
  3. Query OK, 1 row affected (0.00 sec)
  4.  
  5. mysql> SELECT empresa, IFNULL(SUM(facturacion), 0) Facturacion
  6.     -> FROM tabla1 T1 LEFT JOIN (SELECT * FROM tabla2 WHERE ejercicio = 2009) T2 ON T1.id = T2.id
  7.     -> GROUP BY T1.id;
  8. +------------+-------------+
  9. | empresa    | Facturacion |
  10. +------------+-------------+
  11. | Telefonica |         225 |
  12. | Carrefour  |           0 |
  13. | Prisa      |          75 |
  14. +------------+-------------+
  15. 3 rows in set (0.00 sec)
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #14 (permalink)  
Antiguo 24/05/2011, 10:23
Avatar de Heimish2000  
Fecha de Ingreso: enero-2011
Ubicación: Madrid
Mensajes: 844
Antigüedad: 13 años, 10 meses
Puntos: 89
Respuesta: consultilla...

Lo que yo había puesto
  #15 (permalink)  
Antiguo 24/05/2011, 10:26
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 17 años
Puntos: 2658
Respuesta: consultilla...

Exacto... Buena observación (o sea, posts medio de vicio... )
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #16 (permalink)  
Antiguo 26/05/2011, 01:42
Avatar de arprielo  
Fecha de Ingreso: octubre-2007
Mensajes: 67
Antigüedad: 17 años, 1 mes
Puntos: 0
Solucionado!!!

Gracias a los dos, me ha sido de gran ayuda tanto a mi como a mi empresa.
__________________
Viva Linux! viva Ubuntu...!

Etiquetas: sql, bases-de-datos
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 14:26.