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中,您可以轻松地将列旋转为:
select
pvt.[Nairobi],
pvt.[Milimani],
pvt.[Criminal],
pvt.[1427932800]
from
(select * from test) t
PIVOT
(
count(uid) for [value] in ([Nairobi],[Milimani],[Criminal],[1427932800])
--change the count function and column to match your needs
) as pvt;
另外,正如您在上面所看到的,您需要使用某种聚合函数来使用pivot。希望这有帮助!
更新
重新阅读你的问题之后,我想你可能正在寻找类似的东西:
SELECT
ltrim(substring(t.concat_values, 1, charindex(' ', t.concat_values, 1))) AS first_col
,ltrim(substring(t.concat_values, dbo.GetNthCharacterOccurrence(t.concat_values, ' ', 1), (dbo.GetNthCharacterOccurrence(t.concat_values, ' ', 2) - dbo.GetNthCharacterOccurrence(t.concat_values, ' ', 1)))) AS second_col
,ltrim(substring(t.concat_values, dbo.GetNthCharacterOccurrence(t.concat_values, ' ', 2), (dbo.GetNthCharacterOccurrence(t.concat_values, ' ', 3) - dbo.GetNthCharacterOccurrence(t.concat_values, ' ', 2)))) AS third_col
,ltrim(substring(t.concat_values, dbo.GetNthCharacterOccurrence(t.concat_values, ' ', 3), len(t.concat_values) - dbo.GetNthCharacterOccurrence(t.concat_values, ' ', 3)+1)) AS fourth_col
FROM (
SELECT DISTINCT stuff((
SELECT ' ' + t2.[value]
FROM test t2
WHERE t1.pid = t2.pid
AND t1.mail = t2.mail
FOR XML path('')
), 1, 1, '') AS concat_values
FROM test t1
) t;
此方法的技巧是首先使用带有STUFF
的{{1}}函数创建逗号分隔的值列表。然后,根据字符串分隔符的位置打破字符串,在这种情况下我使用XML Path
('')。
为了找到第n次出现的空间,我借了" Tavis Lovell最初在博客中编写的一个函数。要将值拆分为多个列,我根据需要使用了space
,substring
和用户定义的函数。
答案 1 :(得分:0)
MySQL版本
使用group_concat
和substring_index
函数,您可以轻松地将字符串值转换为多个列,如下所示:
SELECT
SUBSTRING_INDEX(SUBSTRING_INDEX(concat_values, ',',1), ',', -1) as first_col,
SUBSTRING_INDEX(SUBSTRING_INDEX(concat_values, ',',2), ',', -1) as second_col,
SUBSTRING_INDEX(SUBSTRING_INDEX(concat_values, ',',3), ',', -1) as third_col,
SUBSTRING_INDEX(SUBSTRING_INDEX(concat_values, ',',4), ',', -1) as fourth_col
FROM (
SELECT GROUP_CONCAT(value) as concat_values
FROM test t1 --change this to match your table name
) t;