0

经销商有各种销售产品的渠道。产品基于类别。

网点可以从分销商和其他网点接收产品(转移)。每天的期初余额(数量),收货(数量),转入(数量),转出(数量),销售(数量),期末余额(数量)都维护在一个表格中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 作为值来检查如果是所有网点或特定网点)。

在此报告中,所有产品的期初余额将仅在开始日(例如 01/03/2013)检索,然后将显示所有其他字段(产品)的总和(总和)。

在临时表的帮助下,我也实现了同样的目标。但是查询需要很长时间,导致超时。如果我使用简单分组,我需要对期初余额使用聚合函数,这会导致错误数据。

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

CASE如果日期是一个月的第一天,您可以将表达式与条件一起使用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 回答