将列值转换为行值
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;
【讨论】:
以上是关于将列值转换为行值的主要内容,如果未能解决你的问题,请参考以下文章