条件优化查询的金额分组总和

时间:2019-02-05 10:04:39

标签: sql sql-server optimization

我有一个视图,其中包含来自不同表的数据。主要字段是BillNo,ITEM_FEE,GroupNo。实际上,我需要通过传递groupNo来计算总折扣。折扣计算基于按BillNo(单个Bill no可以有多个输入)的金额组的分数。如果单个BillNo有多个交易,则如果ITEM_FEE的总和的小数部分大于0,并且如果只有单个交易并且ITEM_FEE的小数部分大于0,则计算折扣,则小数部分将被视为折扣。 我已经准备好脚本,并且可以获得特定组的总折扣。

declare @GroupNo as nvarchar(100)
set @GroupNo='3051'

SELECT Sum(disc) Discount 
FROM   --sum(ITEM_FEE) TotalAmoiunt, 
(SELECT (SELECT CASE 
                  WHEN ( Sum(item_fee) )%1 > 0 THEN Sum(( item_fee )%1) 
                END 
         FROM   view_bi_sales VBS 
         WHERE  VBS.billno = VB.billno 
         GROUP  BY billno) Disc 
 FROM   view_bi_sales VB 
 WHERE  groupno = @GroupNo)temp

问题是要花近2分钟才能得到结果。

如果可能,请帮助我更快地找到结果。

2 个答案:

答案 0 :(得分:0)

谢谢您的所有帮助和支持,因为我已经按BillNo计算了ITEM_FEE组的小数部分之和,所以不需要检查是否大于0。下面的查询在不到10秒的时间内给了我所需的输出量

  select  sum(discount) from
    (select  sum((ITEM_FEE)%1) discount from view_BI_Sales 
    where groupno=3051
    group by BillNo )temp 

答案 1 :(得分:0)

如果我的理解正确,则您不需要JOIN。这可能有助于提高性能:

SELECT SUM(disc) as Discount 
FROM (SELECT (CASE WHEN SUM(item_fee % 1) > 0
                   THEN SUM(item_fee % 1) 
             END) as disc
      FROM view_bi_sales VBS 
      WHERE groupno = @GroupNo
      GROUP BY billno
     ) vbs;