将列值转换为行值

Posted

技术标签:

【中文标题】将列值转换为行值【英文标题】:Convert column values to row values 【发布时间】:2015-07-08 06:36:07 【问题描述】:
  **uid         pid    mail   value**

     1          78     27     Nairobi

     2          78     27     Milimani

     3          78     27     Criminal

     4          78     27     1427932800

我上面有一个数据库表,只需要“值”列值。我想让交叉表报告的列值显示在行中(不是逗号分隔)。我的理想结果是:

        **Nairobi  Milimani  Criminal  1427932800**

匹配的 'pid' 和 'mail' 表示对应的 'value' 来自单个提交,并且 pid 和 mail 的更改(此处未捕获)是新的提交!

那么我该如何编写一个将“值”列值转换为行值的 sql? 非常感谢任何帮助。

'Pivot' 没有真正的帮助,或者我可能做错了。!!

【问题讨论】:

您使用的是哪个 RDBMS? 所以如果有人多插入一行,你会突然有 5 列?!? convert column values to rows的可能重复 @polycarproyal 为什么你会在同一天两次问同一个问题? 【参考方案1】:

SQL-Server中你可以使用PIVOT

CREATE TABLE #Test
(
    [uid] INT,
    pid INT,
    mail INT,
    value NVARCHAR(60)
)
INSERT INTO #Test VALUES 
(1,          78,     27,     'Nairobi'),
(2,          78,     27,     'Milimani'),
(3,          78,     27,     'Criminal'),
(4,          78,     27,     '1427932800')

这是STATIC PIVOT的例子:

SELECT [Nairobi], [Milimani], [Criminal], [1427932800]
FROM (
    SELECT value
    FROM #Test
) x
PIVOT
(
MAX(value)
FOR value in ([Nairobi], [Milimani], [Criminal], [1427932800])
) piv
DROP TABLE #Test

这是DYNAMIC PIVOT的例子:

DECLARE @cols AS NVARCHAR(MAX),
        @query  AS NVARCHAR(MAX)

SELECT @cols = STUFF((SELECT ',' + QUOTENAME(value) 
                    FROM #test
                    GROUP BY value, [pid]
                    ORDER BY [pid]
            FOR XML PATH(''), TYPE
            ).value('.', 'NVARCHAR(MAX)') 
        ,1,1,'')

SET @query = N'SELECT ' + @cols + N' from 
             (
                SELECT value
                FROM #test
            ) x
            PIVOT
            (
                MAX(value)
                FOR value IN (' + @cols + N')
            ) p '

EXEC sp_executesql @query;

【讨论】:

以上是关于将列值转换为行值的主要内容,如果未能解决你的问题,请参考以下文章

SQL server 如何将列值转换为行

SQL:在 Chartio 中动态地将列转换为行

SQL将一些列名转换为行值,将一个列名行值转换为列名

将列转换为行

使用R将行转换为列,将列转换为行

MySQL将列转换为行