我有一个名为tours
的表,其中我有以下字段
tourId, tourStartDate, tourEndDate , tourDetail ,deptCode,targetYear, and officerName
现在我想将我的数据总结为几个月 所以结果表看起来应该遵循模式
declare @temp table (
id int identity(1,1) not null,
officerName,
jan int ,feb int,
march int,april int,
may int,
june int ,
july int,
aug int,
sep int,
oct int,
nov int,
dec int
);
select * from @temp
我尝试使用with cte
来遍历每一行,并使用大小写插入临时表,但它看起来不是很好的解决方案,所以任何线索或指南都对我有很大的帮助。
该月人员完成的旅行次数将在月份列中显示为值
EDITED
一个游览的开始日期为jan,结束日期为其他月份,比如feb然后它的值将在两个月出现
答案 0 :(得分:2)
您正在寻找pivot
http://msdn.microsoft.com/en-us/library/ms177410(v=sql.105).aspx
像
这样的东西select *
from (select officername, month(tourstartdate) tsm, value from tours) src
pivot
(sum(value) for tsm in ([1],[2],[3],[4],[5],[6],[7],[8],[9],[10],[11],[12])) p
答案 1 :(得分:2)
要使它在两个月内显示,UNION(1)的查询部分按开始日期(2)到结束日期,如果结束是在不同的月份。要比较月份,请使用MONTH获取日期月份。
要将列名称设为月份,请使用DateName(月份)。要使其保持一致,请使用LEFT仅使用前3个字符。
要将行转换为列,请使用PIVOT。
SELECT officerName, Jan,Feb,Mar,Apr,May,Jun,Jul,Aug,Sep,Oct,Nov,Dec
FROM (
select LEFT(datename(month,tourStartDate),3) mon, officerName
from tbl
union all
select LEFT(datename(month,tourEndDate),3) mon, officerName
from tbl
where month(tourStartDate) != month(tourEndDate)
) P
PIVOT (COUNT(mon) for mon in (Jan,Feb,Mar,Apr,May,Jun,Jul,Aug,Sep,Oct,Nov,Dec)) PV