Sql 如果不是所有天数都在表中,如何选择每个工作日/周/月/60天/90天的平均值?
好吧,经过大量的研究,我还是被卡住了。我有一些简单的基本知识: 我可以使用GROUPBY语句选择所有值的平均值。将日期在我的范围内并按我想要的平均值进行分组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
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中不是这样