【问题标题】:How to select the Average per WORK Day/Week/Month/60 Days/90 Days when not all days are in table?当并非所有天数都在表中时,如何选择每个工作日/周/月/60 天/90 天的平均值?
【发布时间】:2014-04-30 16:58:26
【问题描述】:

好的,所以经过大量研究后,我仍然陷入困境。我得到了简单的基础知识:

我可以使用 group by 语句选择所有值的平均值。分组日期在我的范围内并按我想要的平均值。

Select AVG(Qty)
From (
            Select Sum(ItemQty) As Qty
            From ReceivedInfo
            Where DateUsed >= '2014-04-01' 
                         AND DateUsed < '2014-04-30'
            Group By Date(DateUsed)
)

这里的问题是我还需要包含表格中没有的日期。所有工作日都应计入没有条目的偶数天。我不知道如何从数据范围中获得平均每天(或每月,或 60 天等)的数量,包括所有工作日。排除周末。

做这样的事情就够了吗:

Select Sum(QTy) / (julianday('2014-04-30') - julianday('2014-04-01' )) - (((julianday('2014-04-30') - julianday('2014-04-01' )) / 7 ) * 2) As Average
From (
            Select Sum(ItemQty) As Qty
            From ReceivedInfo
            Where DateUsed >= '2014-04-01' 
                         AND DateUsed < '2014-04-30'          
)

或者我必须确定查询之外的工作日数吗?

【问题讨论】:

    标签: sql datetime sqlite


    【解决方案1】:

    不久前,我看到有人用 CTE 做了一些相当有趣的事情,解决了类似的问题:也许这对你有用?

    WITH DateRange(Date) AS
         (
             SELECT '2014-04-01' Date
    
             UNION ALL
    
             SELECT DATEADD(day, 1, Date) Date
             FROM DateRange
             WHERE Date < '2014-04-30'
         )
    
         SELECT CONVERT(VARCHAR(10),Date, 121) -- either SELECT from or JOIN to this table
         FROM DateRange
         WHERE DatePart(dw, Date) NOT IN (1,7) -- this could limit it to Mon-Fri only
    

    编辑:我认为以下将是您将其包含在结果集中的链接:

    Select AVG(Qty)
    From (
                Select Sum(ItemQty) As Qty
                From 
                    DateRange 
                     LEFT JOIN 
                    ReceivedInfo ON 
                        DateRange.Date = ReceivedInfo.DateUsed
                Where DateRange.Date >= '2014-04-01' 
                                 AND DateRange.Date < '2014-04-30'
                Group By DateRange.Date
    )
    

    编辑 2:根据下面的评论者删除了变量。谢谢提醒!

    【讨论】:

    • SQLite 没有变量。
    • 对不起,错过了原始问题中的那个标签:我会适当地修改。感谢您指出这一点!
    • 这似乎不起作用。至少在 SQLite 中没有
    【解决方案2】:

    如果您希望将缺失值视为0,您的最终查询应该可以正常工作。但是,您可以简化它。因此,非常接近:

    Select Sum(QTy) / (5.0/7 * (julianday('2014-04-30') - julianday('2014-04-01' ) ) )
    From ReceivedInfo
    Where DateUsed >= '2014-04-01' AND DateUsed < '2014-04-30';  
    

    当然,这只是工作日数的近似值(类似于您提出的解决方案)。一个完整的解决方案将使用繁琐的星期几算术。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-10-14
      • 2018-12-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多