¿Es posible dar salida a un número fijo de grupos en SQL, incluso si hay un menor número de grupos en el resultado?

El señor Vanderbilt:

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?
Caius Jard:

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

Supongo que te gusta

Origin http://10.200.1.11:23101/article/api/json?id=395622&siteId=1
Recomendado
Clasificación