PIVOT
これには、静的または動的のいずれかを使用できます。このコードをストアド プロシージャに配置して、データグリッドに入力することができます。
静的ピボット( SQL Fiddle with Demoを参照) これは、すべての値をハードコーディングすることを意味します。
select convert(char(10), dt, 101), [Bubai], [Bhanu], ([Bubai] + [Bhanu]) total
from
(
select dt, timelogged, username
from test
)x
pivot
(
sum(timelogged)
for username in ([Bubai], [Bhanu])
)p
union all
select 'total', sum([Bubai]), sum([Bhanu]), sum([Bubai] +[Bhanu])
from
(
select dt, timelogged, username
from test
)x
pivot
(
sum(timelogged)
for username in ([Bubai], [Bhanu])
)p
Dynamic Pivot ( SQL Fiddle with Demoを参照)。これにより、実行時に変換するフィールドのリストが取得されます。
DECLARE @cols AS NVARCHAR(MAX),
@query AS NVARCHAR(MAX),
@totalCol AS NVARCHAR(MAX),
@totalRow AS NVARCHAR(MAX)
SET @cols = STUFF((SELECT distinct ',' + QUOTENAME(c.username)
FROM test c
FOR XML PATH(''), TYPE
).value('.', 'NVARCHAR(MAX)')
,1,1,'')
SET @totalCol = STUFF((SELECT distinct '+' + QUOTENAME(c.username)
FROM test c
FOR XML PATH(''), TYPE
).value('.', 'NVARCHAR(MAX)')
,1,1,'')
SET @totalRow = STUFF((SELECT distinct ',Sum(' + QUOTENAME(c.username) + ')'
FROM test c
FOR XML PATH(''), TYPE
).value('.', 'NVARCHAR(MAX)')
,1,1,'')
set @query = 'SELECT convert(char(10), dt, 101), ' + @cols + ', '+@totalCol +' total from
(
select dt, timelogged, username
from test
) x
pivot
(
sum(timelogged)
for username in (' + @cols + ')
) p
union all
select ''total'', '+ @totalRow +', sum('+@totalCol+')
from
(
select dt, timelogged, username
from test
)x
pivot
(
sum(timelogged)
for username in (' + @cols + ')
)p'
execute(@query)
これらはどちらも同じ結果になります。