将列值转换为行

时间:2015-07-07 20:43:59

标签: sql

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

2 个答案:

答案 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。希望这有帮助!

SQL Fiddle Demo

更新

重新阅读你的问题之后,我想你可能正在寻找类似的东西:

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;

SQL Fiddle Demo 2

此方法的技巧是首先使用带有STUFF的{​​{1}}函数创建逗号分隔的值列表。然后,根据字符串分隔符的位置打破字符串,在这种情况下我使用XML Path('')。 为了找到第n次出现的空间,我借了" Tavis Lovell最初在博客中编写的一个函数。要将值拆分为多个列,我根据需要使用了spacesubstring和用户定义的函数。

答案 1 :(得分:0)

  

MySQL版本

使用group_concatsubstring_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;

MySQL Demo