将列值转换为行值

时间:2015-07-08 06:36:07

标签: mysql sql pivot

  **uid         pid    mail   value**

     1          78     27     Nairobi

     2          78     27     Milimani

     3          78     27     Criminal

     4          78     27     1427932800

我上面有一个DB表,只需要'value'列值。我想让列值显示在行(不是逗号分隔)中,以用于交叉表报表。我理想的结果是:

        **Nairobi  Milimani  Criminal  1427932800**

匹配的'pid'和'mail'表示相应的'value'来自单个提交,pid和邮件的更改(此处未捕获)是新提交的内容!

那么如何编写一个sql来将'value'列值转换为行值? 任何帮助非常感谢。

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

1 个答案:

答案 0 :(得分:0)

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;