2011-03-06 21 views
5

主にC#開発者であるため、日付範囲の集合を指定して日/月を要約する問題に対する純粋なT-SQLベースのソリューションを作成しようとすると、頭が痛いです。日付範囲を基準に月を集計する

私はこのような何かを探しているデータのセットを持っている:

UserID Department StartDate EndDate 
====== ========== ========== ========== 
1  A   2011-01-02 2011-01-05 
1  A   2011-01-20 2011-01-25 
1  A   2011-02-25 2011-03-05 
1  B   2011-01-21 2011-01-22 
2  A   2011-01-01 2011-01-20 
3  C   2011-01-01 2011-02-03 

日付の範囲は、数ヶ月に及ぶことが単月内の特定のユーザーや部門のためのいくつかの範囲が存在することが、重複していません。 私は何をしたいのは(...私の例では、任意の演算エラーの予約で)このように、ユーザー、部署、年と月ごとの日数(包括的)を要約している:

UserID Department Year Month Days 
====== ========== ==== ===== ==== 
1  A   2011 01  10 
1  A   2011 02  4 
1  A   2011 03  5 
1  B   2011 01  2 
2  A   2011 01  20 
3  C   2011 01  31 
3  C   2011 02  3 

このデータは、レポートツールで使用される新しいテーブルに格納されます。 問題の説明が十分に明確であることを願っています。これは私の最初の投稿です。穏やかです:-)

ありがとうございます!

答えて

8

ワーキングサンプル

-- sample data in a temp table 
declare @t table (UserID int, Department char(1), StartDate datetime, EndDate datetime) 
insert @t select 
1 ,'A', '2011-01-02','2011-01-05'union all select 
1 ,'A', '2011-01-20','2011-01-25'union all select 
1 ,'A', '2011-02-25','2011-03-05'union all select 
1 ,'B', '2011-01-21','2011-01-22'union all select 
2 ,'A', '2011-01-01','2011-01-20'union all select 
3 ,'C', '2011-01-01','2011-02-03' 

-- the query you need is below this line  

select UserID, Department, 
    YEAR(StartDate+v.number) Year, 
    MONTH(StartDate+v.number) Month, COUNT(*) Days 
from @t t 
inner join master..spt_values v 
    on v.type='P' and v.number <= DATEDIFF(d, startdate, enddate) 
group by UserID, Department, YEAR(StartDate+v.number), MONTH(StartDate+v.number) 
order by UserID, Department, Year, Month 
+0

ありがとう! ** master..spt_values **のうまく動作していて面白いですが、以前はそのシステムテーブルに遭遇していませんでした。 ** master..spt_values **の詳細については、こちらをご覧ください。[http://stackoverflow.com/questions/4273723/what-is-the-purpose-of-system-table-table-master-spt-価値観とは何なのか?) –

+0

元の「集計表」を使用する場合は+1。 ;-) –

関連する問題