PIVOTで縦持ちのTBLを横持ちに表示したい

アリティ
2014-01-22 16:38 2655 1
PIVOTで縦持ちのTBLを横持ちに表示したい
DB:SQLServer2005

TB1
ID ID名 時刻 V1 V2 V3
--- --- ---- ------ ----- ------
01 N01 7時 10 111 2111
01 N01 8時 20 112 2112
02 N02 7時 21 221 2211
02 N02 8時 22 222 2212
02 N02 9時 23 223 2213

期待結果
ID ID名 7時V1 7時V2 7時V3 8時V1 8時V2 8時V3 9時V1 9時V2 9時V3
-- --- ----- ----- ---- ----- ----- ------ ---- ----- ------
01 N01 10 111 2111 20 112 2112 0 0 0
02 N02 21 221 2211 22 222 2212 23 223 2213


PIVOT演算子を使ってみましたが、
集計カラムが複数の場合の指定方法が分かりませんでした。
誰かご教授いただけますでしょうか。

コメント

2014年 01月 24日 (20:16)
こんにちは。
イノ(inno)です。

PIVOTを利用してはいませんが、
期待結果が出るSQLを添付します。
下記のSQLを実行して確認してください。

USE tempdb
GO

-- #### テーブル作成
CREATE TABLE dbo.TempData
(
UserID varchar(10)
, UserName varchar(10)
, TimeDate nvarchar(10)
, V1 int
, V2 int
, V3 int
)
GO

-- #### テスト用のデータ登録
INSERT INTO dbo.TempData (UserID, UserName, TimeDate, V1, V2, V3)
SELECT '01', 'N01', N'07時', 10, 111, 2111 UNION ALL
SELECT '01', 'N01', N'08時', 20, 112, 2112 UNION ALL
SELECT '02', 'N02', N'07時', 21, 221, 2211 UNION ALL
SELECT '02', 'N02', N'08時', 22, 222, 2212 UNION ALL
SELECT '02', 'N02', N'09時', 23, 223, 2213
GO

-- #### 結果
DECLARE @StrColumn nvarchar(max)
SET @StrColumn = ''
SELECT @StrColumn = @StrColumn + ', MAX(CASE WHEN TimeDate = N''' + TimeDate + ''' THEN ' + ColName + ' END) [' + TimeDate + ColName + ']'
FROM
(
SELECT DISTINCT TimeDate FROM dbo.TempData
) A,
(
SELECT 'V1' ColName UNION ALL
SELECT 'V2' ColName UNION ALL
SELECT 'V3' ColName
) B


EXEC ('
SELECT UserID, MAX(UserName)
'+@StrColumn+'
FROM dbo.TempData
GROUP BY UserID
')
GO
-- #### ここまで実行。


-- #### テストデータ追加登録
INSERT INTO dbo.TempData (UserID, UserName, TimeDate, V1, V2, V3)
SELECT '01', 'N01', N'10時', 40, 114, 2114
GO

-- #### 再度結果確認。
DECLARE @StrColumn nvarchar(max)
SET @StrColumn = ''
SELECT @StrColumn = @StrColumn + ', MAX(CASE WHEN TimeDate = N''' + TimeDate + ''' THEN ' + ColName + ' END) [' + TimeDate + ColName + ']'
FROM
(
SELECT DISTINCT TimeDate FROM dbo.TempData
) A,
(
SELECT 'V1' ColName UNION ALL
SELECT 'V2' ColName UNION ALL
SELECT 'V3' ColName
) B


EXEC ('
SELECT UserID, MAX(UserName)
'+@StrColumn+'
FROM dbo.TempData
GROUP BY UserID
')
GO
-- #### ここまで実行。