我目前有以下查询:
select
DATEADD(MONTH, DATEDIFF(MONTH, 0, StartDate), 0) as MonthYear, count(*) as Count
from
visit
where
StartDate >= DATEADD(year,-1,GETDATE())
and clientid = 142
group by
DATEADD(MONTH, DATEDIFF(MONTH, 0, StartDate), 0)
Run Code Online (Sandbox Code Playgroud)
返回以下结果:
+-------------------------+----+
| 2015-12-01 00:00:00.000 | 1 |
| 2016-02-01 00:00:00.000 | 13 |
| 2016-03-01 00:00:00.000 | 1 |
| 2016-04-01 00:00:00.000 | 22 |
| 2016-05-01 00:00:00.000 | 22 |
| 2016-06-01 00:00:00.000 | 25 |
| 2016-07-01 00:00:00.000 | 36 |
+-------------------------+----+
Run Code Online (Sandbox Code Playgroud)
我也有以下查询:
SELECT TOP (12)
DATEADD(MONTH, DATEDIFF(MONTH, 0, GETDATE()) - test, 0) as MonthYear
FROM
test
Run Code Online (Sandbox Code Playgroud)
返回以下结果:
+-------------------------+
| 2016-10-01 00:00:00.000 |
| 2016-09-01 00:00:00.000 |
| 2016-08-01 00:00:00.000 |
| 2016-07-01 00:00:00.000 |
| 2016-06-01 00:00:00.000 |
| 2016-05-01 00:00:00.000 |
| 2016-04-01 00:00:00.000 |
| 2016-03-01 00:00:00.000 |
| 2016-02-01 00:00:00.000 |
| 2016-01-01 00:00:00.000 |
| 2015-12-01 00:00:00.000 |
| 2015-11-01 00:00:00.000 |
+-------------------------+
Run Code Online (Sandbox Code Playgroud)
我需要做的是将两个查询合并为一个查询,并显示原始查询中缺少的那些月份的0.
有人可以帮忙吗?
如果您要进行大量间隙和岛计算和/或无间隙的基于日期的查询,那么我无法强调日历表将使您的生活变得多么简单。
基本上,您所需要的只是一个类似于以下内容的表:
压延机
Day INT,
Month INT,
Year INT,
StartOfDay DATETIME,
EndOfDay DATETIME,
DayOfWeek INT,
WeekInyear INT,
IsWeekDay BIT
Run Code Online (Sandbox Code Playgroud)
选择一个日期范围。我选择本世纪和上世纪,因为它符合我的商业模式需求。接下来,只需运行一次循环函数并填充表,最后应用适当的索引并根据需要使用。
DECLARE @BeginDate DATETIME ='01/01/2015'
DECLARE @EndDate DATETIME ='01/01/2017'
DECLARE @MONTHS TABLE(Month INT,Year INT)
WHILE @BeginDate<=@EndDate BEGIN
INSERT @Months SELECT DATEPART(MONTH,@BeginDate),DATEPART(YEAR,@BeginDate)
SET @BeginDate=DATEADD(MONTH,1,@BeginDate)
END
SELECT
Calendar.Month,
Calendar.Year,
COUNT(visit.userID)
FROM
@Months Calendar
LEFT JOIN visit ON visit.year=Calendar.Year AND visit.Month=Calendar.Month
GROUP BY
Calendar.Month,
Calendar.Year
Run Code Online (Sandbox Code Playgroud)