如何从sql server中选择年度的逐月数据

如何从sql server中选择年度的逐月数据,sql,sql-server,sql-server-2008,Sql,Sql Server,Sql Server 2008,我有一个用户表,其中的数据大约有20年的历史。 我想从CreatedOn列(2014-07-08 17:44:00)中获取月份数据,如果任何月份的数据都不可用,那么我希望本月的数据为0 范例 Month data year jan 34 2014 feb 56 2014 march 0 2014 apr 23 2014 我正在使用以下查询,但它不起作用: with cte(monno , monname ) as(

我有一个用户表,其中的数据大约有20年的历史。 我想从CreatedOn列(2014-07-08 17:44:00)中获取月份数据,如果任何月份的数据都不可用,那么我希望本月的数据为0

范例

Month   data    year
jan      34     2014
feb      56     2014
march    0      2014
apr      23     2014
我正在使用以下查询,但它不起作用:

with cte(monno , monname ) as(
select 1, 'Jan' union all 
select 2, 'Feb' union all 
select 3, 'Mar' union all 
select 4, 'Apr' union all 
select 5, 'May' union all 
select 6, 'Jun' union all 
select 7, 'Jul' union all 
select 8, 'Aug' union all 
select 9, 'Sep' union all 
select 10, 'Oct' union all 
select 11, 'Nov' union all 
select 12, 'Dec' 
)

SELECT DISTINCT monname
    ,monno
    ,count(CreatedOn) OVER (PARTITION BY datepart(year, CreatedOn),DATEPART(MONTH, CreatedOn))
FROM Contributors_tbl a
RIGHT JOIN cte b ON DATEPART(MONTH, CreatedOn) = b.monno
AND datepart(year, CreatedOn) = 2014
ORDER BY monno

尝试使用这种方法查找月份编号和月份名称

    CREATE TABLE #TempMonth
    (
        MonthNum int,
        MonthNames varchar(50)
    )

    INSERT INTO  #TempMonth 
    SELECT STR(MONTH(DATEADD(mm, number, GETDATE())), 2) AS MonthNum, 
    DATENAME(month, DATEADD(month, MONTH(DATEADD(mm, number, GETDATE())), 0) - 1) AS MonthNames
    FROM master.dbo.spt_values
    WHERE (name IS NULL) AND (number BETWEEN 0 AND 11) ORDER BY STR(MONTH(DATEADD(mm, number, GETDATE())), 2)


    SELECT * FROM #TempMonth

    select distinct MonthNames,MonthNum,
    count(CreatedOn) over(partition by datepart(year,CreatedOn),DATEPART(MONTH,CreatedOn))
    from Contributors_tbl a 
    right join #TempMonth b on DATEPART(MONTH,CreatedOn) = b.MonthNum and datepart(year,CreatedOn) = 2014
    order by MonthNum

    DROP Table #TempMonth
试试这个

with cte(monno , monname ) as(
select 1, 'Jan' union all 
select 2, 'Feb' union all 
select 3, 'Mar' union all 
select 4, 'Apr' union all 
select 5, 'May' union all 
select 6, 'Jun' union all 
select 7, 'Jul' union all 
select 8, 'Aug' union all 
select 9, 'Sep' union all 
select 10, 'Oct' union all 
select 11, 'Nov' union all 
select 12, 'Dec' 
)
select monname,
monno,
coalesce(cnt,0) as cnt
from cte c
outer apply (
select count(*) as cnt
from Contributors_tbl 
where CreatedOn >= DATEADD(mm,c.monno - 1,'20140101')
And CreatedOn < DATEADD(mm,c.monno,'20140101')
)t
order by monno

我觉得你的问题很好。什么不起作用?你有错误信息吗?CreateOn列的数据类型是什么?其结果出乎意料。我的数据列是SmallDateTime请提供示例数据和预期输出以及您得到的输出。我们无法理解结果是否出乎意料,因为columndata是countCreatedOn按datepartyear、CreatedOn、DATEPARTMONTH、CreatedOn过度分配的结果?