多行数据合并为单行

时间:2017-07-19 04:45:58

标签: sql pivot

我正在尝试将多行数据合并到一行,然后联合到另一个表。但不幸的是,我在多行整合方面失败了。我尝试了在网站上找到的Pivot选项,但作为一个新手,我失败了。

我的多行数据表看起来像这样 - current table

我喜欢像下面那样创建表格 - future table

在此之后,我喜欢内部加入另一个基于ID的表。 不知道如何为它编写枢轴或其他公式。

请给我一些启示 -

1 个答案:

答案 0 :(得分: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。获取姓名和列名

在表@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。获取透视列名称

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