如何从sql server中选择年度的逐月数据
我有一个用户表,其中的数据大约有20年的历史。 我想从CreatedOn列(2014-07-08 17:44:00)中获取月份数据,如果任何月份的数据都不可用,那么我希望本月的数据为0 范例如何从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(
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过度分配的结果?