user3580480:
Tengo la siguiente tabla simplificada.
|---------------------|------------------|------------------|
| month | customer | value |
|---------------------|------------------|------------------|
| 1 | A | 20 |
|---------------------|------------------|------------------|
| 1 | B | 20 |
|---------------------|------------------|------------------|
| 1 | C | 20 |
|---------------------|------------------|------------------|
| 2 | A | 20 |
|---------------------|------------------|------------------|
| 2 | B | 20 |
|---------------------|------------------|------------------|
Como se puede ver, no es de valor para el cliente C, por mes 2.
En este caso tengo que añadir programtically meses = '2' cliente = valor 'C' = '0', dentro de mi instrucción de selección
SELECT month, customer, value FROM mytable
Tengo muchas más filas en mi mesa real, pero el resultado final tiene que ser la misma lista de clientes para cada mes.
Cualquier ayuda muy apreciada.
Gordon Linoff:
Use una cross join
para generar las filas y una left join
para traer los valores:
select m.month, c.customer, coalesce(t.value, 0) as value
from (select distinct month from t) m cross join
(select distinct customer from t) c left join
t
on t.month = m.month and t.customer = c.customer;
Nota: Si usted tiene otras fuentes para los meses o los clientes, a continuación, los que son probablemente más rápido que usar count(distinct)
.