Ver Mensaje Individual
  #6  
Antiguo 05-08-2019
bucanero bucanero is offline
Miembro
 
Registrado: nov 2013
Ubicación: Almería, España
Posts: 208
Reputación: 11
bucanero Va camino a la fama
hola a todos

Una forma de poder solucionar tu problema puede ser esta:
Código SQL [-]
select distinct cliente.cliente, 
Ifnull((
  -- ventas enero
  SELECT sum(importe) AS importe
  FROM compra
  WHERE month(fecha) = 1 and year(fecha) = year(now()) AND cliente=cliente.cliente
  GROUP BY cliente, month(fecha)
), 0) as enero, 
Ifnull((
  -- ventas enero
  SELECT sum(importe) AS importe
  FROM compra
  WHERE month(fecha) = 2 and year(fecha) = year(now()) AND cliente=cliente.cliente
  GROUP BY cliente, month(fecha)
), 0) as febrero, 
-- ...,
Ifnull((
  -- ventas enero
  SELECT sum(importe) AS importe
  FROM compra
  WHERE month(fecha) = 12 and year(fecha) = year(now()) AND cliente=cliente.cliente
  GROUP BY cliente, month(fecha)
), 0) as diciembre 
from compra cliente
WHERE year(fecha) = year(now()) AND cliente<>''
GROUP BY cliente

El problema:
que te sale una morcilla de SQL... y a parte puede llegar a ser bastante lenta la ejecución, y cualquier cambio en las subconsultas de los meses tienes que aplicarlas a los doce meses.

Cita:
Empezado por oscarac Ver Mensaje
busca la utilizacion de "Pivot"
En cuanto a "PIVOT", que es la solución perfecta a este problema, es un método que realiza el motor de BBDD de microsoft MsSQL y no se si existe también en algún otro motor de BBDD, pero creo que no existe como tal en MySQL, o por lo menos yo no he encontrado nunca información de como aplicarlo directamente para MySQL. Si es verdad que con procedimientos y tablas en memoria se puede llegar a hacer, pero no es tan trivial como lo hace MsSQL.

Lo que si tiene MySQL y se puede utilizar en este caso es la función GROUP_CONCAT() que puede hacer algo similar, concatena los valores de un determinado campo para varios registros cuando se hace un GROUP BY

El ejemplo para este caso sería este:
Código SQL [-]
SELECT cliente.cliente, GROUP_CONCAT(ifNull(ventas.importe, 0) ORDER BY mes.mes SEPARATOR '\,') as resumen
FROM
  -- genera un registro para cada mes de cada cliente
  ((SELECT DISTINCT month(fecha) AS mes FROM compra) mes,
   (SELECT DISTINCT cliente FROM compra) cliente)
  -- rellena los importes del mes
  LEFT JOIN (
    SELECT cliente, month(fecha) AS mes, sum(importe) AS importe
    FROM compra
    WHERE year(fecha)=year(now()) AND cliente<>''
    GROUP BY cliente, month(fecha)
  ) ventas ON ventas.cliente=cliente.cliente AND ventas.mes=mes.mes
GROUP BY cliente

Ventajas: El SQL es mucho mas corto que el anterior, y a nivel de rendimiento, también es mas rápido.
Desventajas: Los datos de ventas salen todos en el mismo campo, separados por comas. Pero entre comillas es un mal menor, puesto que ya desde delphi es relativamente fácil procesarlos, por ejemplo añadiendo los campos de los meses como campos calculados en el query/tabla e inserta el valor en evento onCalculate
Responder Con Cita