1

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各行をトラバースし、ケースを使用して一時テーブルに挿入しようとしましたが、それは良い解決策のようには見えないので、手がかりやガイドは本当に私を大いに助けてくれます。

その月に役員が行ったツアーの数は、月の列に値として表示されます

編集済み

1月に開始日、他の月に終了日があるツアー、たとえば2月の場合、その値は両方の月に表示されます

4

2 に答える 2

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
于 2012-10-01T12:37:20.907 に答える
2

両方の月に表示されるようにするには、UNIONは、(1)開始日(2)のクエリ部分を終了日(終了日が別の月の場合)でクエリします。また、月を比較するには、MONTHを使用して日付の月を取得します。

列名を月として取得するには、DateName(Month、)を使用します。一貫性を保つために、 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
于 2012-10-01T12:51:34.887 に答える