Redshift SQL – Formato alto/largo a formato ancho
Tengo una tabla llamada “source_table”.
| Date | Country | Subscribers |
----------------------------------------
| 2021-10-01 | USA | 5 |
| 2021-10-12 | Canada | 10 |
| 2021-10-23 | USA | 15 |
--
| 2021-11-01 | USA | 10 |
| 2021-11-05 | Canada | 20 |
Quiero convertir esto en formato ancho.
| Country | Oct-21 | Nov-21 | Dec-21 |
--------------------------------------
| USA | 53 | 68 | 12 |
| Canadá | 35 | 86 | 21 |
Intenté el siguiente código:
SELECT country,
CASE WHEN date BETWEEN '2021-10-01' AND '2021-10-31' THEN SUM(subscribers)
END AS "Oct-21",
CASE WHEN date BETWEEN '2021-11-01' AND '2021-11-30' THEN SUM(subscribers)
END AS "Nov-21",
CASE WHEN date BETWEEN '2021-12-01' AND '2021-12-31' THEN SUM(subscribers)
END AS "Dec-21"
FROM
source_table
GROUP BY
country
Pero el código anterior lanza un error que dice:
column "source_table.date" must appear in the GROUP BY clause or be used in an aggregate function
No estoy seguro de por qué se necesita la columna “date” en GROUP BY. Si la incluyo en GROUP BY, el nombre del país se repetirá varias veces y eso no es lo que se desea. El nombre del país debería aparecer solo una vez con el número de suscriptores agregados por mes y no debería haber ningún valor nulo en las columnas (hay al menos un suscriptor en cada día para cada país en source_table).
¿Me falta algo aquí? Por favor, ayuda. Estoy utilizando SQL en Redshift.
davy.ai
El mensaje de error se debe al uso de una función de agregado (SUM) en la declaración SELECT, pero sin incluir la columna de fecha en la cláusula GROUP BY. SQL requiere que cualquier columna no agregada en la declaración SELECT se incluya en la cláusula GROUP BY.
Para solucionar este error, podrías usar una subconsulta para agrupar los datos por país y fecha, y luego pivotar los resultados usando la función SUM. Aquí está el código modificado que debería funcionar:
En el código anterior, la subconsulta agrupa los datos por país y fecha, y luego la consulta externa pivota los resultados usando la función SUM en combinación con las declaraciones CASE. La función COALESCE se utiliza para reemplazar cualquier valor NULL por 0.
Ten en cuenta que en el código modificado, la función date_trunc se utiliza para verificar solo el mes y no fechas exactas, para evitar perder datos que puedan estar fuera de los rangos de fecha especificados.