Показать лидера продаж среди товаров по каждому дню

Подскажите пожалуйста как можно вычислить лидера продаж среди товаров по каждому дню из следующих таблиц. введите сюда описание изображения введите сюда описание изображения

Как я понял задание, нужно получить таблицу с с лидерами на каждый день. Я использую обобщенное табличное выражение для суммирования конкретного товара, проданного за день.

WITH sum_quantity_by_days (id_tovar, sales_date, sum_quantity) AS (
SELECT [s].id_tovar, [s].sales_date,  SUM(quantity_kg) AS quantity_kg
FROM [sales] AS [s]
GROUP BY [s].sales_date, [s].id_tovar)

В итоге я имею табличку: введите сюда описание изображения

Использую SQL Server Management Studio 18.7.

Далее я попробовал найти через группировку:

WITH sum_quantity_by_days (id_tovar, sales_date, sum_quantity) AS (
SELECT [s].id_tovar, [s].sales_date,  SUM(quantity_kg) AS quantity_kg
FROM [sales] AS [s]
GROUP BY [s].sales_date, [s].id_tovar)SELECT [s_q_b_d].sales_date, MAX(sum_quantity) AS max_quantity
FROM [sum_quantity_by_days] AS [s_q_b_d]
GROUP BY [s_q_b_d].sales_date

Выводит то что нужно, но не полностью (отсутствуют названия продуктов): введите сюда описание изображения


Ответы (1 шт):

Автор решения: Yitzhak Khabinsky

Попробуйте следующее решение.

SQL

-- DDL and sample data population, start
DECLARE @tovar TABLE (id_tovar INT PRIMARY KEY, tovar_name NVARCHAR(30));
INSERT INTO @tovar (id_tovar, tovar_name) VALUES
(1, N'сахар'),
(2, N'мука'),
(3, N'гречневая крупа');

DECLARE @sales TABLE (id_sales INT PRIMARY KEY, id_tovar INT, sales_date DATE, quantity_kg INT);
INSERT INTO @sales (id_sales,id_tovar, sales_date, quantity_kg) VALUES
(1, 1, '2011-01-01', 10),
(2, 2, '2011-01-02', 3),
(3, 1, '2011-01-02', 5),
(4, 3, '2011-01-02', 20),
(5, 1, '2011-01-03', 10),
(6, 2, '2011-01-02', 18);
-- DDL and sample data population, end

;WITH cte AS
(
    SELECT id_tovar, sales_date, SUM(quantity_kg) AS quantity_kg
    FROM @sales
    GROUP BY id_tovar, sales_date
), rs AS
(
    SELECT *
        , ROW_NUMBER() OVER (PARTITION BY sales_date ORDER BY quantity_kg DESC) AS seq
    FROM cte
)
SELECT rs.sales_date, t.tovar_name, rs.quantity_kg 
FROM rs INNER JOIN 
    @tovar AS t ON t.id_tovar = rs.id_tovar
WHERE rs.seq = 1;

Результат

+------------+------------+-------------+
| sales_date | tovar_name | quantity_kg |
+------------+------------+-------------+
| 2011-01-01 | сахар      |          10 |
| 2011-01-02 | мука       |          21 |
| 2011-01-03 | сахар      |          10 |
+------------+------------+-------------+
→ Ссылка