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.

Tengo 3 filas por usuario, necesito tener una fila (con 3 columnas) por usuario en su lugar.

Estoy creando una tabla con las 3 primeras compras por cliente junto con el conteo total de compras por dicho cliente, utilizando un CTE. Hice esto exitosamente con la siguiente consulta, pero muestra 3 filas para cada usuario con una fila para la primera fecha de compra, la segunda fecha de compra y la tercera fecha de compra como filas separadas. Estoy tratando de mostrar las 3 fechas de compra como columnas, con una fila para cada usuario, en su lugar.

Esta tabla tiene cientos de filas, por lo que no puedo escribir los IDs de usuario necesarios en el código. ¿Alguna idea? ¿Hay alguna forma de fusionar 3 CTEs o escribir código para mostrar la fecha de pago más temprana, la segunda fecha más temprana, la tercera fecha más temprana y el monto total del usuario como columnas? El código actual está abajo:

WITH cte_2
     AS (SELECT customer_id,
                payment_date,
                Row_number()
                  OVER (
                    partition BY customer_id
                    ORDER BY payment_date ASC) AS purchase_number
         FROM   payment)
SELECT cte_2.customer_id,
       cte_2.payment_date,
       cte_2.purchase_number,
       Count(payment_id) AS total_payments
FROM   payment
       INNER JOIN cte_2
               ON payment.customer_id = cte_2.customer_id
WHERE  purchase_number <= 3
GROUP  BY cte_2.customer_id,
          cte_2.payment_date,
          purchase_number
ORDER  BY customer_id ASC

Resultado actual con el código anterior:

currentoutput

Resultado preferido:

preferredoutput

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Para obtener la salida deseada con las 3 fechas de compra como columnas y una fila para cada usuario, puedes pivotar los datos utilizando la función PIVOT.

    Aquí tienes un ejemplo de consulta utilizando PIVOT:

    WITH cte_2
         AS (SELECT customer_id,
                    payment_date,
                    Row_number()
                      OVER (
                        partition BY customer_id
                        ORDER BY payment_date ASC) AS purchase_number
             FROM   payment),
         cte_3
         AS (SELECT customer_id,
                    payment_date,
                    purchase_number,
                    Count(payment_id) AS total_payments
             FROM   payment
                    INNER JOIN cte_2
                            ON payment.customer_id = cte_2.customer_id
             WHERE  purchase_number <= 3
             GROUP  BY customer_id,
                       payment_date,
                       purchase_number)
    SELECT customer_id, [1] AS earliest_purchase, [2] AS second_purchase, [3] AS third_purchase, total_payments
    FROM   cte_3
           PIVOT (Min(payment_date) FOR purchase_number IN ([1], [2], [3])) AS p;
    

    La consulta anterior crea dos CTE similares a la consulta original. Luego selecciona las columnas necesarias de la CTE 3 y pivota los datos en la columna purchase_number utilizando la función PIVOT. El resultado es la salida deseada con una fila para cada usuario y las 3 fechas de compra como columnas.

    Ten en cuenta que en la cláusula PIVOT utilizamos la función Min(payment_date) ya que solo necesitamos la fecha de compra más temprana para cada purchase_number. Además, los [1], [2], [3] en la cláusula FOR purchase_number IN representan las columnas creadas por la función PIVOT. Puedes modificar estos valores para que coincidan con la cantidad de fechas de compra que tengas.

Comments are closed.