我已经编写了下面的查询,但运行速度非常慢。有人能建议我如何改进,甚至把我推向正确的方向吗?
我的目标是列出当月每个销售区域的销售额和成本(区域基本上是客户经理)
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
如果不考虑VFP中多个字段的复合索引,我建议您的l_itran表至少只在it_dtedelv字段上有一个索引。可以是复合的,但由于日期进程和其他字段的连接字符串和dtot(),这会变得很混乱。
接下来,如果您在不同的月份/年份部分运行函数,VFP无法优化日期查询。相反,创建两个变量,分别到达当前月初和下个月初。例如:2019年2月1日和2019年3月1日。这样,你可以在2月1日之前获得更大或相等的东西,但在3月1日以下,如果你的日期字段包括时间,则在2月的最后一天至晚上11:59:59。
此外,您不需要通过查询所有记录,然后对结果求和来嵌套查询。这应该是可行的,正如我在下面所做的。最后一点提示/问题。为什么要对事务的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