У меня есть следующая таблица, содержащая данные о продажах продукта из группы сетевых магазинов. Данные большие и уродливые, но единственный способ получить его из магазинов. Для информации таблица в настоящее время содержит 22 миллиона записей, которые растут примерно на 300 тыс. В день, и этот темп роста будет экспоненциально увеличиваться примерно на 100% ежемесячно.SQL Multiple Join/Sums on Product table
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
Любая помощь будет принята с благодарностью. Благодарю.
Разница в поле TillslipID добавляет 2 минуты к времени выполнения запроса, но я не мог придумать другого способа сделать это. – mutantskin