У меня есть следующая таблица, содержащая данные о продажах продуктов из группы сетевых магазинов. Данные большие и некрасивые, но только так я могу получить их из магазинов. Для информации, в настоящее время таблица содержит 22 миллиона записей, число которых увеличивается примерно на 300 тысяч в день, и этот темп роста будет экспоненциально увеличиваться примерно на 100% ежемесячно.
Store_Purchases(
[ID] [int] IDENTITY(1,1) NOT NULL,
[storecode] [int] NULL,
[dtDatum] [datetime] NULL,
[Barcode] [varchar](50) NULL,
[Desc] [varchar](100) NULL,
[qty] [int] NULL,
[amount] [money] NULL,
[TillslipID] [int] NULL)
Запрос, который мне нужно извлечь из этого, — это 500 лучших продуктов в соответствии с суммой всех продаж за диапазон дат. Для каждого из этих продуктов мне нужно показать штрих-код, описание, сумму проданного количества, сумму продаж, а также количество кассовых чеков, на которых был продукт, и, наконец, общую сумму всех продуктов.
Пока мне удалось придумать следующее. Выполнение этого запроса на моем сервере занимает 2 минуты 20 секунд, и я думаю, что значение «Сумма корзины» неверно. Я хотел бы знать, есть ли лучший способ сделать это в одном запросе или даже в хранимой процедуре.
SELECT
a.Barcode,
a.Desc,
SUM(b.amount) 'Basket SUM',
COUNT(distinct b.TillslipID) 'Basket Count',
Sales.Count,
Sales.Amount
FROM Store_Purchases b WITH (NOLOCK),
Store_Purchases a WITH (NOLOCK),
(
SELECT
top 500 Barcode,
sum(qty) "Count",
SUM(amount) "Amount"
FROM Store_Purchases WITH (NOLOCK)
WHERE (storecode = 30143)
AND dtDatum BETWEEN '1-Feb-2013 00:00:00' AND '28-Feb-2013 23:59:59'
GROUP BY Barcode
ORDER BY SUM(amount) DESC
) AS Sales
WHERE (a.storecode = 30143)
AND a.dtDatum BETWEEN '1-Feb-2013 00:00:00' AND '28-Feb-2013 23:59:59'
AND a.Barcode = Sales.Barcode
AND a.TillslipID = b.TillslipID
AND a.storecode = b.storecode
AND b.dtDatum BETWEEN '1-Feb-2013 00:00:00' AND '28-Feb-2013 23:59:59'
GROUP BY a.Barcode, a.Desc, Sales.Count, Sales.Amount
ORDER BYSales.Count DESC
Любая помощь будет оценена по достоинству. Спасибо.