チェーン ストア グループの製品販売データを含む次のテーブルがあります。データは大きくて醜いですが、ストアから入手できる唯一の方法です。参考までに、テーブルには現在 2,200 万件のレコードが保持されており、1 日あたり約 30 万件ずつ増加しており、この増加率は毎月約 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 秒かかります。「Basket Sum」の値が間違っていると思います。単一のクエリ、またはストアド プロシージャでこれを行うためのより良い方法があるかどうかを知りたいです。
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
どんな助けでも大歓迎です。ありがとう。