2017-07-19 67 views
0

我正在嘗試將多行數據合併到單個行,然後合併到另一個表。但不幸的是,我多行合併失敗了。我嘗試在網站上找到的Pivot選項,但作爲新手,我失敗了。多行數據合併爲單行

我多行數據表看起來像這樣 - current table

我喜歡創造類似下面的表格 - future table

在此之後,我喜歡內加入另一桌與此基礎上ID。 不知道如何編寫數據透視表或其他公式。

請告訴我一些關於它的光 -

+0

您使用哪個DBMS? –

回答

0

我不知道哪些DBMS您使用,但這裏是使用T-SQL的SQL Server的解決方案。我通過使用動態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.獲取名稱和COLUMNNAMES

在@ColumnsPerName手動添加應考慮爲你的最終結果列的表。

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.得到樞軸COLUMNNAMES

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.獲取結果

DECLARE @pivotHeaders VARCHAR(MAX) 
SELECT @pivotHeaders = COALESCE(@pivotHeaders + ', ', '') + '[' + PivotHeader + ']' FROM #PivotColumns 

DECLARE @pSql NVARCHAR(MAX) 
SET @pSql = 'SELECT ID, ' + @pivotHeaders + ' FROM (SELECT s.ID, c.PivotHeader, s.PivotValue FROM #PivotColumns AS c LEFT OUTER JOIN #PivotSource AS s ON s.PivotHeader = c.PivotHeader) AS p PIVOT (MAX(p.PivotValue) FOR PivotHeader IN (' + @pivotHeaders + ')) AS ptable' 
EXEC sp_executesql @psql 
+0

謝謝,凱文。我的錯誤,我應該添加數據而不是圖片。我正在使用SQL Server 2012.我會在今天檢查並通知您。 – Namee

+0

謝謝凱文:-) – Namee