【问题标题】:sum of amount group by condition optimise query按条件优化查询的金额总和
【发布时间】:2019-02-05 20:00:36
【问题描述】:

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

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 分钟才能得到结果。

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

【问题讨论】:

  • 这么多的聚合也就不足为奇了。也许您应该提供示例数据和预期输出,以便我们可以改变您的查询
  • 你能发布你的视图view_bi_sales的定义吗?我怀疑您上面的查询是根本问题,它更有可能是底层视图的问题。
  • 您能否提供一些示例数据和您的预期输出
  • 在总和上做% 1 有什么意义?
  • 我觉得相关子查询最好由窗口聚合函数处理。但是,如果没有样本数据和结果,很难确定。

标签: sql sql-server optimization


【解决方案1】:

感谢大家的帮助和支持,因为我已经用 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 

【讨论】:

    【解决方案2】:

    如果我理解正确,您不需要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;
    

    【讨论】:

      猜你喜欢
      • 2022-06-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-10-03
      • 1970-01-01
      相关资源
      最近更新 更多