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

时间:2019-02-07 10:24:53

标签: sql optimization query-optimization visual-foxpro

我编写了以下查询,但运行速度非常慢。谁能建议我如何改善它,甚至向正确的方向推动我?

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

IT包含订单行

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 个答案:

答案 0 :(得分:0)

在不进入VFP中多个字段的复合索引的情况下,我建议至少,您的l_itran表仅在it_dtedelv字段上具有索引。可以复合,但是作为连接字符串和日期处理以及其他字段的dtot()会变得混乱。

接下来,如果您在不同的月份/年份部分上运行函数,则VFP无法优化日期查询。而是创建两个变量,这些变量到达当前月份的开始,然后到达以下月份的开始。例如:2019年2月1日和2019年3月1日。通过这种方式,您可以使2月1日前的所有内容均大于或等于2月1日,但小于3月1日(包括日期2月的最后一天,直到11:59:59 pm)(如果您输入日期字段)包含时间。

此外,您不需要通过查询所有记录然后对结果求和来嵌套查询。正如我在下面所述,这应该是可行的。给您的最后提示/问题。为什么要向事务的HEADER表添加LEFT JOIN。我认为应该总是有一个标题,但这就是我。

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
相关问题