Задача по выводу информации по выручке в разрезе месяца в SQL
Прошу помощи с решением данной задачи в виде sql запроса в Oracle DB -
дано -
Магазины: • ID • Name
Товары: • Id • Name • Price (стоимость за единицу)
Продажи : • ID Магазина • ID Товара • Дата • Количество единиц товара
необходимо: Вывести информацию по 10 лучшим по выручке магазинам в разрезе месяца.
Такой вариант, наверное некорректен из-за использования Limit?
SELECT id.Магазины, Price*amount AS Выручка
FROM ТОВАРЫ
INNER JOIN ПРОДАЖИ ON ТОВАРЫ.id.Товар=ПРОДАЖИ.id.Товар
WHERE MONTH(date)=4
GROUP BY 1
ORDER BY 2 DESC
LIMIT 10;
Ответы (1 шт):
Лучше с помощью DENSE_RANK (строкам с одинаковыми значениями выручки присвоятся одинаковые номера, причём по порядку, без пропусков(в отличие от RANK) и появится столбец "Лидер". Для получения итоговой таблицы предлагаю воспользоваться подзапросом с алиасом q:
SELECT id.Магаз, Лидер \* итоговая таблица, куда можно добавить Выручку и что ещё потребуется*\
FROM
(
SELECT id.Магаз, price*amount AS
Выручка
DENSE_RANK()OVER(ORDER BY
price*amount DESC) AS Лидер
FROM ТОВАРЫ
INNER JOIN ПРОДАЖИ
ON ТОВАРЫ.id.Товар=ПРОДАЖИ.id.Товар
WHERE MONTH(date)=4
GROUP BY 1)q
WHERE Лидер<=10;
Т.о.,DENSE_RANK() даст одно и то же значение магазинам с одинаковой выручкой независимо от их количества - и все они будут учтены в столбце "Лидер".