es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

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.

Tags:  , ,

Answer

  1. Avatar for 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:

    SELECT 
        country,
        COALESCE(SUM(CASE WHEN date_trunc('month', date) = '2021-10-01' THEN subscribers END), 0) AS "Oct-21",
        COALESCE(SUM(CASE WHEN date_trunc('month', date) = '2021-11-01' THEN subscribers END), 0) AS "Nov-21",
        COALESCE(SUM(CASE WHEN date_trunc('month', date) = '2021-12-01' THEN subscribers END), 0) AS "Dec-21"
    FROM (
        SELECT 
            country, 
            date, 
            SUM(subscribers) AS subscribers 
        FROM 
            source_table 
        GROUP BY 
            country, date
    ) AS t 
    GROUP BY 
        country;
    

    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.

Comments are closed.