0

ディストリビューターには、製品を販売するためのさまざまなアウトレットがあります。製品はカテゴリに基づいています。

販売店は、流通業者や他の販売店から製品を受け取ることができます (転送)。毎日の開始残高 (数量)、受け取り (数量)、転送 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)

クエリを最適化するために助けが必要です。前もって感謝します。

4

1 に答える 1

0

CASEif date is the first day of month or not: という条件で式をdDate = DATEADD(month, DATEDIFF(month, 0, dDate), 0)使用できます。

SELECT
  SUM(CASE 
        WHEN CAST(dDate AS DATE) = DATEADD(month, 
                                           DATEDIFF(month, 0, dDate), 
                                           0) THEN iOpeningBalance
        ELSE 0 END) AS 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;

編集

これを試して:

WITH CTE
AS
(
  SELECT
    ProductID,
    SUM(ReceiptS) TotalReceiptS, 
    SUM(TranIN) TotalTranIN, 
    SUM(TranOut) TotalTranOut, 
    SUM(Sale) TotalSale
  FROM txnTransactions 
  GROUP BY ProductID
)
SELECT
  c.*,
  [Total/Balance] = (SELECT TOP 1 OpeningBalance
                     FROM txnTransactions AS t
                     WHERE t.ProductID = c.ProductID
                     AND CAST(t.dDate AS DATE) = DATEADD(month,
                                                         DATEDIFF(month, 0, t.dDate), 
                                                         0)) + 

                     TotalReceiptS + 
                     TotalTranIN - 
                     TotalTranOut - 
                     TotalSale  
FROM CTE AS c;

SQL フィドルのデモ

于 2013-03-26T07:24:52.943 に答える