【问题标题】:SQL Optimization - calculating sales for current month by account managerSQL 优化 - 由客户经理计算当月销售额
【发布时间】:2019-02-07 10:24:52
【问题描述】:

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

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

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 

【问题讨论】:

  • 你能告诉我们表和索引的定义,以及任何解释/执行计划吗?
  • 它的视觉狐狸亲

标签: sql optimization query-optimization visual-foxpro


【解决方案1】:

如果不涉及 VFP 中多个字段的复合索引,我建议您的 l_itran 表至少在 it_dtedelv 字段上有一个索引。可以是复合的,但是作为连接字符串和 dtot() 用于日期过程和其他字段会变得混乱。

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

此外,您不需要通过查询所有记录然后对结果求和来嵌套查询。这应该是可行的,如下所示。最后的说明/问题给你。为什么你有一个 LEFT JOIN 似乎是事务的 HEADER 表。我认为应该总是有一个标题,但这只是我。

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

【讨论】:

  • 非常感谢您,我正在自学这一点。我买了几本书,尽我所能,这对我有很大帮助。
  • @LewisMorris,可以帮助您使用 VFP。如果您想从大型帖子中获得更多离线信息,我们可以点击聊天室 chat.stackoverflow.com/rooms/882/programmers 告诉我。
  • 你真好。我不是在国际上与 VFP 合作。
  • 对不起,我没有完成!谢谢您的好意。我不是故意使用 VFP,它正是我们工作中使用的系统,当标准报告没有为我提供我想要的东西时,我开始深入挖掘。我正在尝试自学 SQL,目前正在阅读一本关于数据分析的 Wiley 书籍。在过去的几年里,我自学了 VBA(并且变得非常精通),并将 SQL 视为下一步。但是如果有一天你有时间,我很想了解更多关于所有主题的信息。
  • @LewisMorris,去聊天室(或这里)给我你的电子邮件,然后我们可以删除这些 cmets,这样它就不会保持公开可见。告诉我。
猜你喜欢
  • 2019-07-24
  • 1970-01-01
  • 2021-10-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-11-01
  • 2014-09-27
相关资源
最近更新 更多