Sql 如果不是所有天数都在表中,如何选择每个工作日/周/月/60天/90天的平均值?

Sql 如果不是所有天数都在表中,如何选择每个工作日/周/月/60天/90天的平均值?,sql,datetime,sqlite,Sql,Datetime,Sqlite,好吧,经过大量的研究,我还是被卡住了。我有一些简单的基本知识: 我可以使用GROUPBY语句选择所有值的平均值。将日期在我的范围内并按我想要的平均值进行分组 Select AVG(Qty) From ( Select Sum(ItemQty) As Qty From ReceivedInfo Where DateUsed >= '2014-04-01' AND Dat

好吧,经过大量的研究,我还是被卡住了。我有一些简单的基本知识:

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

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'          
)

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

不久前,我看到有人用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:根据下面的注释删除变量。谢谢你的提醒

如果希望将缺少的值视为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';  

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

SQLite没有变量。很抱歉,在原始问题中遗漏了该标记:我将进行适当修改。谢谢你指出这一点!这似乎不起作用。至少在SQLite中不是这样