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

union all + group by

Estas en el tema de union all + group by en el foro de Mysql en Foros del Web. a partir de una tabla: encargos necesito hacer un consulta donde debo obtener una tabla seleccionada entre fechas articulo, ventas1, ventas2, ventas3, ventas4, ventas5, ventas6, ...
  #1 (permalink)  
Antiguo 06/03/2017, 04:52
 
Fecha de Ingreso: agosto-2002
Ubicación: Lleida
Mensajes: 503
Antigüedad: 17 años, 2 meses
Puntos: 0
union all + group by

a partir de una tabla: encargos
necesito hacer un consulta donde debo obtener una tabla seleccionada entre fechas

articulo, ventas1, ventas2, ventas3, ventas4, ventas5, ventas6, ventas7

y lo hago con el UNION ALL
Código SQL:
Ver original
  1. (SELECT encargos.monturaVta AS montura, COUNT(*) AS ventastda1 , 0 AS ventastda2, 0 AS ventastda3, 0 AS ventastda4, 0 AS ventastda5, 0 AS ventastda6, 0 AS ventastda7
  2. FROM encargos
  3. WHERE encargos.fechaVta>='2017-01-30' AND encargos.fechaVta<='2017-02-06' AND
  4.         encargos.tdaVta=1 AND encargos.monturaVta>''   
  5. GROUP BY encargos.monturaVta)
  6.  
  7. UNION ALL
  8.  
  9. (SELECT encargos.monturaVta AS montura, 0 AS ventastda1, COUNT(*) AS ventastda2, 0 AS ventastda3, 0 AS ventastda4, 0 AS ventastda5, 0 AS ventastda6, 0 AS ventastda7
  10. FROM encargos
  11. WHERE encargos.fechaVta>='2017-01-30' AND encargos.fechaVta<='2017-02-06' AND
  12.     encargos.tdaVta=2 AND encargos.monturaVta>''
  13. GROUP BY encargos.monturaVta)
  14.  
  15. UNION ALL
  16.  
  17. (SELECT encargos.monturaVta AS montura, 0 AS ventastda1, 0 AS ventastda2, COUNT(*) AS ventastda3, 0 AS ventastda4, 0 AS ventastda5, 0 AS ventastda6, 0 AS ventastda7
  18. FROM encargos
  19. WHERE encargos.fechaVta>='2017-01-30' AND encargos.fechaVta<='2017-02-06' AND
  20.     encargos.tdaVta=3 AND encargos.monturaVta>''
  21. GROUP BY encargos.monturaVta)
[/CODE]

esto me saca una tabla tal:
art1 1 0 0 0 0 0 0
art1 0 1 0 0 0 00
art2
art2
art2

es decir, por cada select una linea,
cómo puedo hacer que me agrupe por articulo el resultado final?

Última edición por gnzsoloyo; 24/03/2017 a las 17:10
  #2 (permalink)  
Antiguo 06/03/2017, 12:34
Colaborador
 
Fecha de Ingreso: enero-2007
Ubicación: México
Mensajes: 2.097
Antigüedad: 12 años, 10 meses
Puntos: 447
Respuesta: union all + group by

Hola mikil:

Creo que estás enfocando mal tu consulta, sin embargo no nos explicas qué es en realidad lo que quieres hacer, pero veamos si entendí bien tu código.

Según lo que veo, lo que intentas es contar cuántas ventas hay de cada tipo (1 a 7) de cada artículo... esto más que haciendo subconsultas y UNION's, lo puedes resolver en una simple consulta utilizando sumas condicionales... checa este ejemplo:

Supongamos que tienes estos datos:

Código MySQL:
Ver original
  1. mysql> SELECT * FROM tabla;
  2. +----------+--------+--------+--------+
  3. | articulo | venta1 | venta2 | venta3 |
  4. +----------+--------+--------+--------+
  5. | art 1    |      1 |      0 |      0 |
  6. | art 1    |      1 |      0 |      0 |
  7. | art 1    |      0 |      1 |      0 |
  8. | art 1    |      0 |      0 |      1 |
  9. | art 2    |      1 |      0 |      0 |
  10. | art 2    |      1 |      0 |      0 |
  11. | art 2    |      1 |      0 |      0 |
  12. | art 2    |      0 |      0 |      1 |
  13. +----------+--------+--------+--------+
  14. 8 rows in set (0.00 sec)


Ahora bien, si queremos sacar el total de ventas tipos 1, 2 y 3 para cada artículo, simplemente hacemos algo así:

Código MySQL:
Ver original
  1. mysql> SELECT
  2.     ->   articulo,
  3.     ->   SUM(IF(venta1 > 0, 1, 0)) total_ventas1,
  4.     ->   SUM(IF(venta2 > 0, 1, 0)) total_ventas2,
  5.     ->   SUM(IF(venta3 > 0, 1, 0)) total_ventas3
  6.     -> FROM tabla
  7.     -> GROUP BY articulo;
  8. +----------+---------------+---------------+---------------+
  9. | articulo | total_ventas1 | total_ventas2 | total_ventas3 |
  10. +----------+---------------+---------------+---------------+
  11. | art 1    |             2 |             1 |             1 |
  12. | art 2    |             3 |             0 |             1 |
  13. +----------+---------------+---------------+---------------+
  14. 2 rows in set (0.00 sec)

Dale un vistazo para ver si es lo que necesitas, de lo contrario postea unos datos de ejemplo y dinos qué es lo que esperas obtener con esos datos. De esta manera es posible que haya otra forma más simple de hacer lo que quieres... finalmente, hay otra forma "ruda" de utilizar lo que ya hiciste, y es volviendo a agrupar toda la consulta, es decir, hacer algo así:

Código MySQL:
Ver original
  1.   encargos.monturaVta montura,
  2.   sum(ventastda1) ventastda1,
  3.   sum(ventastda2) ventastda2,
  4.   sum(ventastda3) ventastda3,
  5.   sum(ventastda4) ventastda4,
  6.   sum(ventastda5) ventastda5,
  7.   sum(ventastda6) ventastda6,
  8.   sum(ventastda7) ventastda7
  9. (
  10.     --Aquí pones tu consulta
  11. ) T
  12. group by monturaVta

Sin embargo, consultas así tienen un pésimo rendimiento. Haz la prueba con lo que puse arriba y nos comentas.

Saludos
Leo
  #3 (permalink)  
Antiguo 21/03/2017, 12:51
 
Fecha de Ingreso: agosto-2002
Ubicación: Lleida
Mensajes: 503
Antigüedad: 17 años, 2 meses
Puntos: 0
Respuesta: union all + group by

bueno, explico mejor
tengo una tabla

articulo tda stock
0001 1 3
0001 2 1
0001 3 0
0002 2 1
0002 3 3
0003 1 1


y quiero tener una VISTA

articulo stoctda1 stoctoda2 stoctda3
0001 3 1 0
0002 0 1 3
0003 1 0 0

así al mostrar el stock por agrupaciones de articulos sale directo.

las tiendas son fijas tienen un maximo de 5.
  #4 (permalink)  
Antiguo 24/03/2017, 12:50
Colaborador
 
Fecha de Ingreso: enero-2007
Ubicación: México
Mensajes: 2.097
Antigüedad: 12 años, 10 meses
Puntos: 447
Respuesta: union all + group by

Hola de nuevo mikil:

¿Te tomaste al menos el tiempo para analizar las consultas que te puse? creo que no, porque si lo hubieras hecho te habrías dado cuenta que la consulta que puse al inicio te puede servir, solo cambiando la condición del IF para preguntar por el numero de tienda y sumar stock en lugar de sumar 1

Código MySQL:
Ver original
  1. mysql> SELECT * FROM tabla;
  2. +----------+------+-------+
  3. | articulo | tda  | stock |
  4. +----------+------+-------+
  5. | 0001     |    1 |     3 |
  6. | 0001     |    2 |     1 |
  7. | 0001     |    3 |     0 |
  8. | 0002     |    2 |     1 |
  9. | 0002     |    3 |     3 |
  10. | 0003     |    1 |     1 |
  11. +----------+------+-------+
  12. 6 rows in set (0.00 sec)
  13.  
  14. mysql> SELECT
  15.     ->   articulo,
  16.     ->   SUM(IF(tda = 1, stock, 0)) stock_tienda1,
  17.     ->   SUM(IF(tda = 2, stock, 0)) stock_tienda2,
  18.     ->   SUM(IF(tda = 3, stock, 0)) stock_tienda3
  19.     -> FROM tabla
  20.     -> GROUP BY articulo;
  21. +----------+---------------+---------------+---------------+
  22. | articulo | stock_tienda1 | stock_tienda2 | stock_tienda3 |
  23. +----------+---------------+---------------+---------------+
  24. | 0001     |             3 |             1 |             0 |
  25. | 0002     |             0 |             1 |             3 |
  26. | 0003     |             1 |             0 |             0 |
  27. +----------+---------------+---------------+---------------+
  28. 3 rows in set (0.00 sec)

Mucho ojo con eso, no esperes encontrar en el foro una consulta sólo para copiar y pegar y que funcione a la perfección. Aquí encontrarás ayudas que te acercarán a lo que debes hacer, pero en la mayoría de los casos tendrás que hacer ajustes para que se adecuen a lo que tienes.

Si lo que te ponemos como ayuda NO TE SIRVE, entonces comienzas por decirnos qué hiciste y el por qué la consulta falla.

Saludos
Leo.

Etiquetas: group, select, tabla, union
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 08:39.