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

mysql hacer dos consultas a la vez misma tabla

Estas en el tema de mysql hacer dos consultas a la vez misma tabla en el foro de Mysql en Foros del Web. (SELECT id,concepto,sum(importe),mes, fecha FROM `2011` where id between 1 and 100 group by id,fecha order by id +0,fecha asc,mes -0) union (SELECT id, concepto, importe, ...
  #1 (permalink)  
Antiguo 01/03/2012, 13:03
 
Fecha de Ingreso: mayo-2008
Mensajes: 181
Antigüedad: 13 años, 7 meses
Puntos: 0
Pregunta mysql hacer dos consultas a la vez misma tabla

(SELECT id,concepto,sum(importe),mes, fecha FROM `2011` where id between 1 and 100 group by id,fecha order by id +0,fecha asc,mes -0)
union
(SELECT id, concepto, importe, mes, fecha
FROM `2011`
WHERE id
BETWEEN 1
AND 100
ORDER BY id,fecha asc,mes -0)

Me hace bien la suma de las cantidades pero a la hora de mostrar los datos me mezcla las cosas

quiero que me salga

1 tema1 100 405 2005
y luego
1 tema1 10 205 2005
1 tema1 10 305 2005
1 tema1 40 405 2005
1 tema1 40 905 2005
luego
2 tema5 200 505 2005
2 tema5 100 205 2005
2 tema5 100 505 2005



¿Se puede hacer que salga asi la consulta?

Gracias
  #2 (permalink)  
Antiguo 01/03/2012, 13:17
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Sabadell
Mensajes: 4.897
Antigüedad: 13 años, 10 meses
Puntos: 574
Respuesta: mysql hacer dos consultas a la vez misma tabla

Código MySQL:
Ver original
  1. SELECT id, tipo, concepto, importe, mes, fecha
  2. (SELECT id,"Total" as tipo, concepto,sum(importe),mes, fecha
  3. FROM `2011` where id between 1 and 100 group by id,fecha)
  4. (SELECT id, " " as tipo, concepto, importe, mes, fecha
  5. FROM `2011`
  6. AND 100)
  7. ORDER BY id,tipo ASC,fecha asc,mes -0;

Chapucero pero puede servir...

UNION no respeta el ORDER BY interno, debes buscar un ORDER BY que te sirva pero usando la query UNION como subquery...
__________________
Quim
--------------------------------------------------
Ayudar a ayudar es una buena práctica!!! Y da buenos resultados.

Última edición por quimfv; 01/03/2012 a las 13:24
  #3 (permalink)  
Antiguo 01/03/2012, 13:20
Colaborador
 
Fecha de Ingreso: enero-2007
Ubicación: México
Mensajes: 2.097
Antigüedad: 15 años
Puntos: 447
Respuesta: mysql hacer dos consultas a la vez misma tabla

Hola nightduke:

No sé si entendí correctamente qué es lo que estás queriendo hacer, pero si no estoy equivocado, al poner la unión estás tratando de obtener una especie se Subtotales por cada categoría, ya que la consulta es básicamente la misma, pero en una agrupas y en otra no, correcto???

Creo que deberías darle un vistazo a los modificadores del GROUP BY:

http://dev.mysql.com/doc/refman/5.0/...modifiers.html

Si estoy en lo correcto esto te debería servir.

En cuanto a tu pregunta original inténtalo así:

Código MySQL:
Ver original
  1. SELECT id, concepto, sum(importe), mes, fecha
  2. FROM `2011`
  3. where id between 1 and 100
  4. group by id,fecha
  5. SELECT id, concepto, importe, mes, fecha
  6. FROM `2011`
  7. WHERE id BETWEEN 1 AND 100
  8. id, fecha asc, mes

Al poner la cláusula ORDER BY al final de la consulta se ejecuta sobre el resultado de la unión. Me queda la duda que por qué pones ( id +0 y mes - 0) en el ORDER BY, nunca me había topado con esta sintaxis, igual y alguna funcionalidad que desconozco.

Saludos
Leo.
  #4 (permalink)  
Antiguo 01/03/2012, 16:14
 
Fecha de Ingreso: mayo-2008
Mensajes: 181
Antigüedad: 13 años, 7 meses
Puntos: 0
Respuesta: mysql hacer dos consultas a la vez misma tabla

Cita:
Iniciado por leonardo_josue Ver Mensaje
Hola nightduke:

No sé si entendí correctamente qué es lo que estás queriendo hacer, pero si no estoy equivocado, al poner la unión estás tratando de obtener una especie se Subtotales por cada categoría, ya que la consulta es básicamente la misma, pero en una agrupas y en otra no, correcto???

Si es lo que estoy intentando hacer, si mi idea es obtener subtotales por cada categoria y en la otra no muestro por meses.


Creo que deberías darle un vistazo a los modificadores del GROUP BY:

http://dev.mysql.com/doc/refman/5.0/...modifiers.html

Si estoy en lo correcto esto te debería servir.

En cuanto a tu pregunta original inténtalo así:

Código MySQL:
Ver original
  1. SELECT id, concepto, sum(importe), mes, fecha
  2. FROM `2011`
  3. where id between 1 and 100
  4. group by id,fecha
  5. SELECT id, concepto, importe, mes, fecha
  6. FROM `2011`
  7. WHERE id BETWEEN 1 AND 100
  8. id, fecha asc, mes

Al poner la cláusula ORDER BY al final de la consulta se ejecuta sobre el resultado de la unión. Me queda la duda que por qué pones ( id +0 y mes - 0) en el ORDER BY, nunca me había topado con esta sintaxis, igual y alguna funcionalidad que desconozco.

pongo id +0 para ordernar de 1 hasta 100, mes -0 para que ordene los ingresos por meses ordenamente 042005 052005 072005, he probado a usar la query pero no ordena como quiero, primero subtotales y luego los ingresos de los meses de 2005 luego los meses de 2006 y de ahi en adelante.... De todas maneras gracias.
Saludos
Leo.
  #5 (permalink)  
Antiguo 02/03/2012, 11:40
Colaborador
 
Fecha de Ingreso: enero-2007
Ubicación: México
Mensajes: 2.097
Antigüedad: 15 años
Puntos: 447
Respuesta: mysql hacer dos consultas a la vez misma tabla

Hola de nuevo:

Aunque trataste de explicar por qué el + 0 no me quedó claro qué es lo que estás intentando hacer (y digo intentando porque mencionas que el código no te funciona).
En primer Lugar deberías decirnos de qué tipo es tu columna fecha, esperaría que fuera de tipo date o datetime, pero lamentablemente aun muchas personas ponen las fechas en campos tipo varchar o cualquier otro y sólo se complican (y nos complican). No estoy seguro si revisaste la opción que te pongo con el WITH ROLLUP... realmente deberías considerarlo. Si entendí bien qué es lo que quieres hacer creo que esto te podría servir:

Supongamos que tienes más o menos estos datos:

Código MySQL:
Ver original
  1. mysql> SELECT * FROM tabla;
  2. +------------+----------+
  3. | fecha      | cantidad |
  4. +------------+----------+
  5. | 2012-02-01 |       10 |
  6. | 2012-02-02 |       20 |
  7. | 2012-03-05 |       32 |
  8. | 2012-03-07 |       12 |
  9. | 2011-02-12 |       17 |
  10. | 2011-02-28 |       21 |
  11. +------------+----------+
  12. 6 rows in set (0.00 sec)

Si entendí correctamente lo que quieres hacer es calcular los subtotales por mes y presentarlos en la misma consulta, junto con sus datos en bruto. utilizando UNION podrías hacer algo como esto;

Código MySQL:
Ver original
  1. mysql> SELECT 1 `nivel`, YEAR(fecha) `año`, MONTH(fecha) `mes`,
  2.     -> NULL `dia`, SUM(cantidad) total
  3.     -> FROM tabla
  4.     -> GROUP BY YEAR(fecha), MONTH(fecha)
  5.     -> UNION
  6.     -> SELECT 2 nivel, YEAR(fecha) `año`, MONTH(fecha) `mes`,
  7.     -> DAY(fecha) `dia`, cantidad total
  8.     -> FROM tabla
  9.     -> ORDER BY `año`, `mes`, `nivel`, `dia`;
  10. +-------+------+------+------+-------+
  11. | nivel | año  | mes  | dia  | total |
  12. +-------+------+------+------+-------+
  13. |     1 | 2011 |    2 | NULL |    38 |
  14. |     2 | 2011 |    2 |   12 |    17 |
  15. |     2 | 2011 |    2 |   28 |    21 |
  16. |     1 | 2012 |    2 | NULL |    30 |
  17. |     2 | 2012 |    2 |    1 |    10 |
  18. |     2 | 2012 |    2 |    2 |    20 |
  19. |     1 | 2012 |    3 | NULL |    44 |
  20. |     2 | 2012 |    3 |    5 |    32 |
  21. |     2 | 2012 |    3 |    7 |    12 |
  22. +-------+------+------+------+-------+
  23. 9 rows in set (0.00 sec)

Observa que se agrega una columna nivel para determinar si se trata de un subtotal o de un dato en bruto, el cual nos sirve justamente para ordenar primero los subtotales y depues los datos.

Ahora bien, esto mismo (y más completo aun) lo puedes hacer con el ROLLUP que te mencioné desde el post pasado:

Código MySQL:
Ver original
  1. mysql> SELECT
  2.     -> CASE WHEN (`mes` IS NULL) THEN 1 ELSE
  3.     -> CASE WHEN (`dia` IS NULL) THEN 2 ELSE 3 END
  4.     -> END `nivel`, T.* FROM (
  5.     -> SELECT
  6.     -> YEAR(fecha) `año`, MONTH(fecha) `mes`, DAY(fecha) `dia`,
  7.     -> SUM(cantidad) total
  8.     -> FROM tabla
  9.     -> GROUP BY `año`, `mes`, `dia`
  10.     -> WITH ROLLUP) T
  11.     -> ORDER BY `año`, `mes`, `nivel`, `dia`;
  12. +-------+------+------+------+-------+
  13. | nivel | año  | mes  | dia  | total |
  14. +-------+------+------+------+-------+
  15. |     1 | NULL | NULL | NULL |   112 |
  16. |     1 | 2011 | NULL | NULL |    38 |
  17. |     2 | 2011 |    2 | NULL |    38 |
  18. |     3 | 2011 |    2 |   12 |    17 |
  19. |     3 | 2011 |    2 |   28 |    21 |
  20. |     1 | 2012 | NULL | NULL |    74 |
  21. |     2 | 2012 |    2 | NULL |    30 |
  22. |     3 | 2012 |    2 |    1 |    10 |
  23. |     3 | 2012 |    2 |    2 |    20 |
  24. |     2 | 2012 |    3 | NULL |    44 |
  25. |     3 | 2012 |    3 |    5 |    32 |
  26. |     3 | 2012 |    3 |    7 |    12 |
  27. +-------+------+------+------+-------+
  28. 12 rows in set (0.02 sec)

La enorme diferencia es que es una sola consulta (no utilizas uniones) y además te calcula las sumas POR CADA NIVEL DE DESAGREGACIÓN, es decir, el total-total, el total por año y el total por mes. El CASE-WHEN tiene las misma función de ordenación de los datos.

Espero que realmente te tomes un tiempo para analizar y comentar este ejercicio y nos digas si te sirvió o no.

Saludos
Leo.

Etiquetas: select, tabla, vez
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:51.