此查询将为您提供给定期间的所有日期以及当天的相应事件:
SQL Fiddle
MS SQL Server 2008 架构设置:
CREATE TABLE Table1
([dt] date, [event] varchar(1))
;
INSERT INTO Table1
([dt], [event])
VALUES
('2014-06-11', 'A'),
('2014-06-20', 'D'),
('2014-06-24', 'A'),
('2014-06-26', 'D'),
('2014-06-29', 'A')
;
查询 1:
declare @start date, @end date
select @start = '2014-06-01', @end = '2014-06-30'
;with dates as (
SELECT @start AS d, (SELECT TOP 1 CASE WHEN event = 'A' THEN 'D' ELSE 'A' END FROM Table1 ORDER BY dt) AS e
UNION ALL
SELECT dateadd(day, 1, d), COALESCE((SELECT event FROM Table1 WHERE dt = dateadd(day, 1, dates.d)), dates.e)
FROM dates
WHERE dates.d < @end)
select * from dates
OPTION (MAXRECURSION 0)
Results:
| D | E |
|------------|---|
| 2014-06-01 | D |
| 2014-06-02 | D |
| 2014-06-03 | D |
| 2014-06-04 | D |
| 2014-06-05 | D |
| 2014-06-06 | D |
| 2014-06-07 | D |
| 2014-06-08 | D |
| 2014-06-09 | D |
| 2014-06-10 | D |
| 2014-06-11 | A |
| 2014-06-12 | A |
| 2014-06-13 | A |
| 2014-06-14 | A |
| 2014-06-15 | A |
| 2014-06-16 | A |
| 2014-06-17 | A |
| 2014-06-18 | A |
| 2014-06-19 | A |
| 2014-06-20 | D |
| 2014-06-21 | D |
| 2014-06-22 | D |
| 2014-06-23 | D |
| 2014-06-24 | A |
| 2014-06-25 | A |
| 2014-06-26 | D |
| 2014-06-27 | D |
| 2014-06-28 | D |
| 2014-06-29 | A |
| 2014-06-30 | A |
使用上面的查询,您将能够轻松地生成计数查询,如下所示:
declare @start date, @end date
select @start = '2014-06-01', @end = '2014-06-30'
;with dates as (
SELECT @start AS d, (SELECT TOP 1 CASE WHEN event = 'A' THEN 'D' ELSE 'A' END FROM Table1 ORDER BY dt) AS e
UNION ALL
SELECT dateadd(day, 1, d), COALESCE((SELECT event FROM Table1 WHERE dt = dateadd(day, 1, dates.d)), dates.e)
FROM dates
WHERE dates.d < @end)
select e, count(*) from dates GROUP BY e
OPTION (MAXRECURSION 0)
结果:
| E | COLUMN_1 |
|---|----------|
| A | 13 |
| D | 17 |
或者像这样:
declare @start date, @end date
select @start = '2014-06-01', @end = '2014-06-30'
;with dates as (
SELECT @start AS d, (SELECT TOP 1 CASE WHEN event = 'A' THEN 'D' ELSE 'A' END FROM Table1 ORDER BY dt) AS e
UNION ALL
SELECT dateadd(day, 1, d), COALESCE((SELECT event FROM Table1 WHERE dt = dateadd(day, 1, dates.d)), dates.e)
FROM dates
WHERE dates.d < @end)
select
sum(case when e='A' THEN 1 ELSE 0 END) as A_days,
sum(case when e='D' THEN 1 ELSE 0 END) as D_days
from dates
OPTION (MAXRECURSION 0)
结果:
| A_DAYS | D_DAYS |
|--------|--------|
| 13 | 17 |