**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”没有真正帮助,或者我可能做错了。!!答案 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;