【问题标题】:Is this is the best way to write SQL for this report? [closed]这是为此报告编写 SQL 的最佳方式吗? [关闭]
【发布时间】:2013-02-12 07:18:46
【问题描述】:

我们有orders 数据,我们需要使用SQL 生成Weekly - Custom date Range of 7 Daysreport。该报告将每周显示count 的订单。用户将选择一个End Date,我们需要根据该日期创建 12 个 DateRange 单位。例如用户选择1/24/2013 我们需要 12 点/单位:

Point12 = End Date - 7 Days
Point11 = End Date - 14 Days
Point10 = End Date - 21 Days
Point9  = End Date - 28 Days
.
.
Point1  = End Date - X Days

我们的解决方案

我们计划创建一个临时表,该表将有 12 行。每行都会有类似的数据(我们将计算每个点的开始日期和结束日期):

Point   StartDate           EndDate      TotalOrders
Point12  2013-01-24          2013-01-30   
Point11  2013-01-17          2013-01-23  

在此之后,我们将获得每行的订单count

这是解决这个问题的好方法还是可以优化?

编辑:

每周的 DateRange 将是 Custom date Range of 7 Days

【问题讨论】:

  • @EdHeal:我可以自己做。但我只想知道我正在以最好的方式做到这一点。
  • 在这种情况下,您应该使用 Table 变量以获得更好的性能。你可以阅读这篇关于差异的文章:sql-server-performance.com/2007/temp-tables-vs-variables
  • 如何获得每一行的count
  • 循环遍历表中的所有 12 行并使用 SELECT COUNT WHERE OrderDate >= @StartDateOfThatRowOrderDate <= @EndDateOfThatRow`
  • @RomanBadiornyi - 该文章包含诸如未记录表变量的事务日志之类的神话。有关更准确的摘要,请参阅my answer here。行数较少的表变量结果更好的原因is explained here

标签: sql sql-server-2008 count group-by


【解决方案1】:

鉴于这是 SQLServer,我建议使用表变量,而不是临时表。

另一种方法是在 CTE 中生成 12 行作为主查询的一部分,而不是在主查询之前作为单独的步骤生成所需的行(在表变量/临时表中)。这将减少所需的步骤总数,但会使主查询稍微复杂一些。

【讨论】:

  • 建议“我建议使用表变量而不是临时表”的理由是什么?我不一定不同意,但您应该说明您认为会获得的好处。
  • 这是一个神话。表变量和#temp 表都保存在tempdb 中,对于这么小的表,它们都可能在内存中拥有所有页面。
  • 它的哪一部分?它根本不支持您的主张?
  • 开始部分:“表变量为查询计划不变的小规模查询提供以下好处”
【解决方案2】:

为什么不只使用周作为分组因素?

SELECT
 WEEKOFYEAR(`date`) AS point,
 SUM(orders) AS order
FROM `tablename`
WHERE `date` BETWEEN `startdate` AND `enddate`
GROUP BY point

【讨论】:

    猜你喜欢
    • 2010-09-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-09
    相关资源
    最近更新 更多