我编写了以下查询,但运行速度非常慢。谁能建议我如何改善它,甚至向正确的方向推动我?
我的目标是列出当月每个销售地区的销售和成本(该地区基本上是客户经理)
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
答案 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