2017-07-19 10 views
0

複数の行のデータを1つの行に統合し、別のテーブルに結合しようとしています。しかし、残念ながら、私は複数行の統合に失敗しました。私はサイトにあるPivotオプションを試しましたが、初心者ではありませんでした。私は以下のような表を作成したいと current table複数行のデータを1行にまとめる

- -

マイ複数行のデータテーブルは次のようになります。この後 future table

を、私は、内側に等に基づいて、これを別のテーブルに参加ID。 ピボットや別の式を書き込む方法がわかりません。私はあなたが使用しているDBMSが、ここではT-SQLを使用してSQL Serverのためのソリューションであるかわからない

+0

どのDBMSを使用しますか? –

答えて

0

-

は私にその上にいくつかの光を示してください。私は動的SQLを使用してこれを解決しました。

1.

次回のソースデータを作成してください、コピーが容易になり、あなたのデータと画像を追加しますが、それを入力しないでください。

CREATE TABLE DataSource (ID INT, Name VARCHAR(255), Details VARCHAR(255), Time_In VARCHAR(255), Time_Out VARCHAR(255), Value VARCHAR(255)) 
INSERT INTO DataSource VALUES 
(1, 'a', 'string', DATEADD(HOUR, -1, GETDATE()), GETDATE(), '1'), 
(1, 'b', 'string', DATEADD(HOUR, -1, GETDATE()), GETDATE(), '2'), 
(1, 'c', 'string', DATEADD(HOUR, -1, GETDATE()), GETDATE(), '3'), 
(2, 'b', 'string', DATEADD(HOUR, -1, GETDATE()), GETDATE(), '4'), 
(3, 'a', 'string', DATEADD(HOUR, -1, GETDATE()), GETDATE(), '1'), 
(3, 'b', 'string', DATEADD(HOUR, -1, GETDATE()), GETDATE(), '2'), 
(3, 'c', 'string', DATEADD(HOUR, -1, GETDATE()), GETDATE(), '3'), 
(3, 'd', 'string', DATEADD(HOUR, -1, GETDATE()), GETDATE(), '4'), 
(4, 'b', 'string', DATEADD(HOUR, -1, GETDATE()), GETDATE(), '1'), 
(4, 'd', 'string', DATEADD(HOUR, -1, GETDATE()), GETDATE(), '2') 

2.手動であなたの最終的な結果のために考慮すべきであるカラムを追加@ColumnsPerName表で名前とcolumnNames

を取得します。

DECLARE @Names TABLE (Name VARCHAR(255)) 
INSERT INTO @Names SELECT DISTINCT Name FROM DataSource 

DECLARE @ColumnsPerName TABLE (ColName VARCHAR(255)) 
INSERT INTO @ColumnsPerName VALUES ('Details'),('Time_In'),('Time_Out'),('Value') 

3.ゲットピボットれる列名

CREATE TABLE #PivotColumns (Name VARCHAR(255), ColName VARCHAR(255), PivotHeader VARCHAR(255)) 
INSERT INTO #PivotColumns 
SELECT Name, ColName, Name + ' ' + ColName FROM @Names CROSS JOIN @ColumnsPerName 

4.ピボットテーブルソース

DECLARE @sql NVARCHAR(MAX) 
SET @sql = '' 
DECLARE @name VARCHAR(255), @colname VARCHAR(255), @pivotHeader VARCHAR(255) 
DECLARE mCursor CURSOR FOR SELECT Name, ColName, PivotHeader FROM #PivotColumns 
OPEN mCursor FETCH NEXT FROM mCursor 
    INTO @name, @colname, @pivotHeader 
WHILE @@FETCH_STATUS = 0 
BEGIN 
    SET @Sql += 'SELECT ID, ''' + @pivotHeader + ''' AS col, ' + @colname 
     + ' AS val FROM DataSource WHERE Name = ''' + @name + ''' UNION ALL ' 
    FETCH NEXT FROM mCursor INTO @name, @colname, @pivotHeader 
END 
CLOSE mCursor 
DEALLOCATE mCursor 

SET @Sql = LEFT(@Sql, LEN(@SQL) - 10) --remove last UNION ALL 

CREATE TABLE #PivotSource (ID INT, PivotHeader VARCHAR(255), PivotValue VARCHAR(255)) 
INSERT INTO #PivotSource 
EXEC sp_executesql @sql 

5を作成

の結果取得
+0

ありがとう、ケビン。私の間違い、私は写真よりもむしろデータを追加する必要があります。私はSQL Server 2012を使用しています。私はそれを今日チェックしてお知らせします。 – Namee

+0

ありがとうKevin :-) – Namee

関連する問題