代码之家  ›  专栏  ›  技术社区  ›  Lewis Morris

SQL优化-按客户经理计算当月销售额

  •  0
  • Lewis Morris  · 技术社区  · 6 年前

    我写了下面的查询,但是运行速度非常慢。有人能建议我如何改进它,甚至把我推向正确的方向吗?

    我的目标是列出本月每个销售区域的销售额和成本(区域基本上是客户经理)

    它包含订单行

    IH包含订单标题(包括销售区域)

    SELECT it.ih_terrtry                          AS terr, 
           Sum(it.it_exvat) / 100                 AS orderTotal, 
           Sum(it.it_cost * it.it_qtydelv) / 1000 AS orderCost 
    FROM   (SELECT it.*, 
                   iH.ih_terrtry 
            FROM   l_itran it 
                   LEFT OUTER JOIN l_ihead ih 
                                ON ih.ih_doc = it.it_doc 
            WHERE  it.it_status = 'X' 
                   AND Month(it_dtedelv) = Month(Datetime()) 
                   AND Year(it_dtedelv) = Year(Datetime())) it 
    GROUP  BY terr 
    
    1 回复  |  直到 6 年前
        1
  •  0
  •   DRapp    6 年前

    在VFP中,如果不使用多个字段的复合索引,我建议至少,您的l_itran表只在it_dtedelv字段上有一个索引。可以是复合的,但如果将日期进程和其他字段的字符串和dtot()连接起来,则会很混乱。

    接下来,如果在不同的月/年部分上运行函数,VFP无法优化日期查询。相反,创建两个变量,分别到达本月初和下个月初。示例:2019年2月1日和2019年3月1日。这样,您可以得到大于或等于2月1日,但小于3月1日,如果您的日期字段包含时间,则包含2月最后一天到晚上11:59:59。

    此外,不需要通过查询所有记录,然后对结果求和来嵌套查询。这应该是一个可行的,因为我有下面。最后一个问题。为什么您有一个左连接到事务的头表。我想应该有个头球,但那只是我。

    fromDate = TTOD( DATETIME()) - DAY( DATETIME()) + 1
    toDate = GOMONTH(x,1)
    
    SELECT ;
            iH.ih_terrtry Terr,;
            Sum(it.it_exvat) / 100 AS orderTotal, ;
            Sum(it.it_cost * it.it_qtydelv) / 1000 AS orderCost;
        FROM;
            l_itran it ;
                LEFT OUTER JOIN l_ihead ih ;
                    ON it.it_doc = ih.ih_doc ;
        WHERE;
                it.it_dtedelv >= fromDate;
            AND it.it_dtedelv < toDate ;
            AND it.it_status = 'X' ;
        GROUP  BY ;
            iH.ih_terrtry