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