Quiero crear un esquema basado en una consulta SQL. El diagrama debe mostrar cada 12 meses del año en curso, incluso si algunos de ellos están todavía en el futuro.
Mi consulta SQL es algo como esto:
SELECT
MONTH (created) as m,
sum (price) as s
FROM
product
WHERE
YEAR (created) = 2020
GROUP BY
m
Por supuesto, esto sólo muestra los resultados para los meses anteriores o actuales, que también tienen ninguna entrada.
Es posible
- para formular la consulta para que 12 grupos se muestran en cualquier caso y
- Si no hay un grupo que se pone un valor por defecto de 0?
Claro, izquierda unirlo a una colección de los 12 meses. Esta es MySQL (ya que utiliza GROUP BY alias, que creo que es sólo de MySQL, Postgres tal vez demasiado):
WITH months as (
SELECT 1 as m
UNION ALL SELECT 2
UNION ALL SELECT 3
UNION ALL SELECT 4
UNION ALL SELECT 5
UNION ALL SELECT 6
UNION ALL SELECT 7
UNION ALL SELECT 8
UNION ALL SELECT 9
UNION ALL SELECT 10
UNION ALL SELECT 11
UNION ALL SELECT 12
)
SELECT
m.m,
sum (p.price) as s
FROM
months m
LEFT JOIN product p
ON
m.m = MONTH(p.created) AND
p.created > '2020-01-01' and p.Created < '2021-01-01'
GROUP BY
m.m
Meses que no coinciden tendrán un NULL, que se resumen como 0
Debe probar y prefieren no utilizar funciones como el año () en la cláusula WHERE porque significan que los índices no se pueden utilizar; en cambio dejar los datos de la tabla solo y poner una búsqueda oscilado en su lugar
Si su MySQL es viejo y no soporta CTE, hacen que una subconsulta en su lugar. Si su base de datos no es MySQL / Pg, o tiene que elegir algo que puede hacer que seleccionar de una tabla que tiene sólo una fila
Un truco alternativa que no emplea una combinación, sería a la unión una carga de cero meses en; ellos no van a contribuir sumas, pero proporcionarán un mes con 0:
SELECT
m,
sum (price) as s
FROM
(
SELECT MONTH(created) as m, price FROM product WHERE created >= '2020-01-01' and created < '2021-01-01'
UNION ALL SELECT 1, 0 UNION ALL SELECT 2, 0 UNION ALL SELECT 3, 0
UNION ALL SELECT 4, 0 UNION ALL SELECT 5, 0 UNION ALL SELECT 6, 0
UNION ALL SELECT 7, 0 UNION ALL SELECT 8, 0 UNION ALL SELECT 9, 0
UNION ALL SELECT 10, 0 UNION ALL SELECT 11, 0 UNION ALL SELECT 12, 0
) x
GROUP BY
m
Si usted tiene una mesa dedicada a los números y fechas, la unión de todo el bloque puede ser reemplazado con una llamada a la misma. Si estás en Postgres, que tiene un generador de serie que puede hacer cosas interesantes