使用开始日期和结束日期在月度报告中分组数据

时间:2012-10-01 12:34:52

标签: sql sql-server sql-server-2008-r2 pivot

我有一个名为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然后它的值将在两个月出现

2 个答案:

答案 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