ディストリビューターには、製品を販売するためのさまざまなアウトレットがあります。製品はカテゴリに基づいています。
販売店は、流通業者や他の販売店から製品を受け取ることができます (転送)。毎日の開始残高 (数量)、受け取り (数量)、転送 IN (数量)、転送 (数量)、販売 (数量)、終了残高 (数量) がテーブルに保持されますtxnTransactions。テーブルの構造は次のとおりです。
Create table txnTransactions
(
  dDate datetime,
  iCategoryID int (FK),
  iProduct ID int (FK),
  iOutletID int (FK),
  iOpeningBalance int,
  iReceipt int,
  iTranIN int,
  iTranOut int,
  iSale int,
  iClosingBalance int
)
すべてのアウトレットの指定された期間 (例: 2013 年 1 月 3 日から 2013 年 3 月 31 日) 内の合計トランザクション (製品単位) についてディストリビューターにレポートが表示されます (チェックする値として 0 を使用しました)。すべてのコンセントまたは特定のコンセントの場合)。
このレポートでは、すべての商品の期首残高が開始日 (例: 2013 年 1 月 3 日) のみ取得され、他のすべてのフィールド (商品ごと) の合計 (合計) が表示されます。
一時テーブルの助けを借りて同じことを達成しました。ただし、クエリには非常に長い時間がかかり、タイムアウトが発生します。単純なグループ化を使用すると、期首残高に集計関数を使用する必要があり、結果として間違ったデータが生成されます。
Select 
   sum(iOpeningBalance), sum(iReceipt), sum(TranIN), sum(TranOut), sum(Sale) 
from 
   txnTransactions 
where 
   datediff(d, dDate, @startDate) <= 0 
   and datediff(d, dDate, @endDate) >= 0
group by 
   iProductID
使いたくないsum(iOpeningBalance)...
出力例は次のとおりです。
ProductID OpeningBalance Receipts TranIN TranOut Sale Total/Balance
1         10             100      40     50      50   50
2         35             165      50     100     50   100
3         3              147      10     60      10   90
期首残高は開始日のもので、他のすべてのフィールドは、開始日と終了日 (手順の入力パラメーター) によって提供される期間の合計です。
Total/Balance is: openingbalance + sum(receipts) + sum(TranIn) - sum(TranOut) - sum(Sale)
クエリを最適化するために助けが必要です。前もって感謝します。