1

チェーン ストア グループの製品販売データを含む次のテーブルがあります。データは大きくて醜いですが、ストアから入手できる唯一の方法です。参考までに、テーブルには現在 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

どんな助けでも大歓迎です。ありがとう。

4

1 に答える 1

0
select top 500 Barcode, [Desc], sum([Count]) as [Count], sum([Amount]) as Amount, sum(BasketSum) as [Basket Sum], count(TillslipID) as [Basket Count]
from (
    select Barcode, [Desc], TillslipID, [Count], [Amount], sum(Amount) over (partition by TillSlipID) as BasketSum
    from (
        select TillslipID, Barcode, [Desc], sum(qty) as [Count], sum(amount) as [Amount]
        FROM ez_Sparbuck_Products p
        WHERE (storecode = 30143) and dtDatum between '1-Feb-2013 00:00:00' and '28-Feb-2013 23:59:59'
        group by Barcode, [Desc], TillslipID, 
    ) t
) t
group by Barcode, [Desc]

これは、バーコードに 2 つの [Desc] がないことを前提としています。これは、達成しようとしている結果を考えると、そのように思われます。そうでない場合は、同じクエリを変更してpartition by Barcodeandを使用できますdistinct

dtDatumこれを行っているデータのボリュームについては、クラスター化されたインデックスをで、おそらく何らかのパーティション分割を で行う必要があると思いますstorecode

于 2013-03-04T10:59:44.943 に答える