Precio de Venta Promedio

Escribe una solución para encontrar el precio promedio de venta para cada producto. `average_price` debe redondearse a 2 decimales. Regresa el resultado en cualquier orden.

#database#basic-aggregate

Tabla: Prices

+---------------+---------+
| Column Name   | Type    |
+---------------+---------+
| product_id    | int     |
| start_date    | date    |
| end_date      | date    |
| price         | int     |
+---------------+---------+

- (`product_id`, `start_date`, `end_date`) es la llave primaria (combinación de columnas con valores únicos) para esta tabla.
- Cada fila de esta tabla indica el precio del `product_id` en el periodo especificado desde la fecha de inicio `start_date` hasta la fecha de fin `end_date`.
- Ningún producto con `product_id` tendrá periodos de fechas traslapados. Lo cual significa que no habrá dos
  periodos que se intersecten para el mismo producto.

Tabla: UnitsSold

+---------------+---------+
| Column Name   | Type    |
+---------------+---------+
| product_id    | int     |
| purchase_date | date    |
| units         | int     |
+---------------+---------+

- Esta tabla puede contener filas duplicadas.
- Cada fila de esta tabla indica la fecha (`purchase_date`), unidades (`units`) y ID (`product_id`) de cada producto vendido.

El formato del resultado se muestra en el siguiente ejemplo.

Ejemplo 1:

Entrada:

Tabla Prices:
+------------+------------+------------+--------+
| product_id | start_date | end_date   | price  |
+------------+------------+------------+--------+
| 1          | 2019-02-17 | 2019-02-28 | 5      |
| 1          | 2019-03-01 | 2019-03-22 | 20     |
| 2          | 2019-02-01 | 2019-02-20 | 15     |
| 2          | 2019-02-21 | 2019-03-31 | 30     |
+------------+------------+------------+--------+

Tabla UnitsSold:
+------------+---------------+-------+
| product_id | purchase_date | units |
+------------+---------------+-------+
| 1          | 2019-02-25    | 100   |
| 1          | 2019-03-01    | 15    |
| 2          | 2019-02-10    | 200   |
| 2          | 2019-03-22    | 30    |
+------------+---------------+-------+

Salida:

+------------+---------------+
| product_id | average_price |
+------------+---------------+
| 1          | 6.96          |
| 2          | 16.96         |
+------------+---------------+

Explicación:
- Precio de venta promedio = Precio total del producto / Número de productos vendidos.
- Precio de venta promedio para el producto 1 = ((100 * 5) + (15 * 20)) / 115 = 6.96
- Precio de venta promedio para el producto 2 = ((200 * 15) + (30 * 30)) / 230 = 16.96

Solución:

WITH data AS (
    SELECT p.product_id,
           s.units,
           s.purchase_date,
           p.price
    FROM prices p
    LEFT JOIN unitssold s
         ON p.product_id = s.product_id
    WHERE s.purchase_date IS NULL
         OR s.purchase_date BETWEEN p.start_date AND p.end_date
    GROUP BY p.product_id, s.purchase_date
)
SELECT product_id,
       CASE WHEN purchase_date IS NULL THEN 0
       ELSE ROUND(SUM(units * price) / SUM(units), 2)
       END AS average_price
FROM data GROUP BY product_id;

slackmart blog © 2024