Mysql 我们非常同意对方的意见。:-)最初的问题是如何调整SQL查询,我的回答是您不应该这样做,但可以使用其他方法,包括链接答案中的预生成日期表。如果最初的海报喜欢一切都保存在db中,那么这是一个很好的答案。然而,根据我解决类似问题的个人经验,这种问题通常在应用层
Mysql 我们非常同意对方的意见。:-)最初的问题是如何调整SQL查询,我的回答是您不应该这样做,但可以使用其他方法,包括链接答案中的预生成日期表。如果最初的海报喜欢一切都保存在db中,那么这是一个很好的答案。然而,根据我解决类似问题的个人经验,这种问题通常在应用层,mysql,sql,date,select,exists,Mysql,Sql,Date,Select,Exists,我们非常同意对方的意见。:-)最初的问题是如何调整SQL查询,我的回答是您不应该这样做,但可以使用其他方法,包括链接答案中的预生成日期表。如果最初的海报喜欢一切都保存在db中,那么这是一个很好的答案。然而,根据我解决类似问题的个人经验,这种问题通常在应用层更容易解决,没有futzy外部联接之类的东西,因为在迭代日期范围时很容易检测到缺失值并替换零。干杯我必须同意,对于这个简单的查询,应用程序级别的解决方案也可以很好地工作。对于更复杂的问题(经常出现的问题),日历表是理想的。很抱歉,我还编辑了我的
我们非常同意对方的意见。:-)最初的问题是如何调整SQL查询,我的回答是您不应该这样做,但可以使用其他方法,包括链接答案中的预生成日期表。如果最初的海报喜欢一切都保存在db中,那么这是一个很好的答案。然而,根据我解决类似问题的个人经验,这种问题通常在应用层更容易解决,没有futzy外部联接之类的东西,因为在迭代日期范围时很容易检测到缺失值并替换零。干杯我必须同意,对于这个简单的查询,应用程序级别的解决方案也可以很好地工作。对于更复杂的问题(经常出现的问题),日历表是理想的。很抱歉,我还编辑了我的question@Steve-O:是的,自从看到更新后,我已经编辑了几次我的答案。:-)我正在使用MySQL。很抱歉,我还编辑了我的question@Steve-O:是的,自从看到更新后,我已经编辑了几次我的答案。:-)
|----DATE----|---ALARM_ID---|---COUNTER---|
| 2012-01-01 | 1 | 32 |
| 2012-01-01 | 2 | 28 |
| 2012-01-02 | 1 | 12 |
| 2012-01-02 | 2 | 23 |
| 2012-01-03 | 1 | 3 |
| 2012-01-03 | 2 | 9 |
| 2012-01-05 | 1 | 8 |
| 2012-01-05 | 2 | 1 |
| 2012-01-07 | 1 | 102 |
| 2012-01-07 | 2 | 78 |
|----DATE----|---COUNTER---|
| 2012-01-01 | 60 |
| 2012-01-02 | 35 |
| 2012-01-03 | 12 |
| 2012-01-04 | 0 |
| 2012-01-05 | 9 |
| 2012-01-06 | 0 |
| 2012-01-07 | 180 |
BEFORE AFTER
|---ID---|---COUNTER---| |---ID---|---COUNTER---|
| 1 | 2 | | 1 | 2 |
| 2 | 6 | | 2 | 6 |
| 3 | 1 | --> | 3 | 1 |
| 5 | 9 | | 4 | 0 |
| 6 | 10 | | 5 | 9 |
| 6 | 10 |
| 7 | 0 |
| 8 | 0 |
select t.num as ID, coalesce(yt.COUNTER, 0)
from all_stats yt right join
( select t1.num + t2.num * 10 + t3.num * 100 + t4.num * 1000 as num
from ( select 1 as num union select 2 union select 3 union select 4 union select 5 union select 6 union select 7 union select 8 union select 9 union select 0 ) t1 cross join
( select 1 as num union select 2 union select 3 union select 4 union select 5 union select 6 union select 7 union select 8 union select 9 union select 0 ) t2 cross join
( select 1 as num union select 2 union select 3 union select 4 union select 5 union select 6 union select 7 union select 8 union select 9 union select 0 ) t3 cross join
( select 1 as num union select 2 union select 3 union select 4 union select 5 union select 6 union select 7 union select 8 union select 9 union select 0 ) t4 )
t on yt.ID = t.num
where (t.num between (select min(ID) from all_stats) and (select max(ID) from all_stats)) order by ID
declare @dateRange table
(
dateBegin datetime,
dateEnd datetime
)
insert into @dateRange (dateBegin, dateEnd)
values ('2012-01-01', '2012-01-07')
;with cte (d)
as (select dateBegin as d
from @dateRange tbl
where datediff(day, tbl.dateBegin, tbl.dateEnd) <= 100
union all
select dateadd(day, 1, cte.d) as d
from cte
inner join @dateRange tbl on cte.d < tbl.dateEnd)
select cte.d, sum(isnull(e.errorCounter, 0))
from cte
left outer join @errors e on e.errorDate = cte.d
group by cte.d
order by cte.d