将两个查询组合在一起以形成月份计数

Phi*_*lip 9 t-sql sql-server

我目前有以下查询:

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.

有人可以帮忙吗?

Ros*_*ush 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)