我有列详细信息
Create table details(
Id [nvarchar](255) primary key
CurrentValue smallint,
CreateAt DateTime
)
CREATE TABLE Dates (
d DATE,
PRIMARY KEY (d)
)
DECLARE @dIncr DATE = '2000-01-01'
DECLARE @dEnd DATE = '2100-01-01'
WHILE ( @dIncr < @dEnd )
BEGIN
INSERT INTO Dates (d) VALUES( @dIncr )
SELECT @dIncr = DATEADD(DAY, 1, @dIncr )
END
我想获取日期和日期为当前值的列,但有时并非每天都输入当前值,所以我想获取日期和日期的每一天。
这是我的查询:
select
AVG(rd1.CurrentValue)
from details
left join Dates as c ON c.d BETWEEN '07-01-2018' AND '07-29-2018'
GROUP BY c.d
order by c.d
我不知道该怎么做
以及如何求平均值
我期望的数据:
Date CurrentValue
========= =======
1/2/2009 1500
2/2/2009 2300
3/2/2009 300
4/2/2009 2200
5/2/2009 0
...
30/2/2009 1500
etc.
答案 0 :(得分:2)
您只需要从“日期”表中join
到Details
表中,而不需要其他方法。通过这种方式,您将获得所有Dates
值以及任何与以下内容匹配的Details
值:
select c.d
,avg(rd1.CurrentValue) as AverageValue
from Dates as c
left join details as d
on c.d = d.CreateAt
where c.d between '07-01-2018' and '07-29-2018'
group by c.d
order by c.d
答案 1 :(得分:1)
将您的LEFT JOIN更改为
left join Dates as c ON C.d = rd1.CreateAt
AND c.d BETWEEN '07-01-2018' AND '07-29-2018'
答案 2 :(得分:1)
date
表仅包含日期范围,没有空格,对吗?d
列是什么?currentvalue
或CurrentWeight
?为什么在您的代码中是CurrentValue
但错误是CurrentWeight
? 尝试使用此代码,我假设列d
是表date
的日期。
date
表将成为主表,因为日期没有空格,因此将其更改为右联接。我们将仅从表详细信息中获取任何数据,因此在使用平均值时,请使用ISNULL将空数据设置为零。
select c.d as [Date],
AVG(ISNULL(rd1.CurrentValue,0)) as [CurrentValue]
from details
right join Dates as c ON c.d BETWEEN '07-01-2018' AND '07-29-2018'
GROUP BY c.d
order by c.d