使用しているデータベース エンジンはわかりませんが、以下のサンプルでは Microsoft SQL Server を使用しています。他のエンジンで動作するように非常に簡単に適応できると確信しています。
まず、次のクエリを使用していくつかのセットアップ データを作成しました。
create table tasks(
[id] int not null identity(1,1),
[DATE] smalldatetime not null,
project_id int not null,
spent_time int not null,
primary key ([id])
)
go
insert into tasks([date],project_id,spent_time)
select '2012-04-02',1,10
union all select '2012-04-02',1,5
union all select '2012-04-02',2,5
union all select '2012-04-03',1,8
union all select '2012-04-03',2,1
go
上記のコメントで述べたように、SQL ステートメントを動的に生成する必要があります。最後に実行する前に、変数 @sql にこれを行います。これが私の解決策です:
declare @sql nvarchar(4000), @project_id nvarchar(10)
select @sql = 'select [date]'
declare c cursor for select distinct convert(nvarchar(10),project_id) as project_id from tasks order by project_id
open c
fetch c into @project_id
while @@FETCH_STATUS = 0
begin
select @sql = @sql + ', sum(case when project_id = ' + @project_id + ' then spent_time else 0 end) as project_' + @project_id
fetch c into @project_id
end
close c
deallocate c
select @sql = @sql + ', sum(spent_time) as sum_of_projects from tasks group by [date] order by [date]'
exec (@sql)
私のテストデータから予想されるように、それは出力を生成します:
date project_1 project_2
---- --------- ---------
2012-04-02 15 5
2012-04-03 8 1
お役に立てれば!
アップデート
OPはカーソルを避けたいと述べているので、次のコードも(少なくともMS SQL Serverでは)カーソルを使用せずに機能します...
declare @sql nvarchar(4000), @project_id nvarchar(10)
select @sql = 'select [date]'
select @sql = @sql + ', sum(case when project_id = ' + project_id + ' then spent_time else 0 end) as project_' + project_id
from (select distinct CONVERT(nvarchar(10), project_id) as project_id from tasks) q
select @sql = @sql + ', sum(spent_time) as sum_of_projects from tasks group by [date] order by [date]'
exec (@sql)