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:
Resultado preferido:
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:
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ónPIVOT
. 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ónMin(payment_date)
ya que solo necesitamos la fecha de compra más temprana para cadapurchase_number
. Además, los[1], [2], [3]
en la cláusulaFOR 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.