簡體   English   中英

將列值轉換為行

[英]convert column values to rows

uid   pid   mail   value
 1     78    27     Nairobi
 2     78    27     Milimani
 3     78    27     Criminal
 4     78    27     1427932800

我上面有一個數據庫表,只需要'value'列值。 我想讓交叉表報表的行中顯示列值(不用逗號分隔)。 我理想的結果是:

        **Nairobi  Milimani  Criminal  1427932800**

匹配的“ pid”和“ mail”表示相應的“值”來自單個提交,而pid和mail(此處未捕獲)的更改是新提交!

所以我怎么寫一個SQL來將“值”列值轉換為行值? 任何幫助,不勝感激。

'Pivot'並沒有真正幫助,或者我可能做錯了。

在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;

同樣,如您在上面看到的,您將需要使用某種聚合函數來使用數據透視。 希望這可以幫助!

SQL小提琴演示

UPDATE

重新閱讀您的問題后,我發現您可能正在尋找這樣的東西:

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小提琴演示2

此方法的竅門是,首先使用帶有XML PathSTUFF函數創建一個逗號分隔的值列表。 然后,根據字符串分隔符的位置斷開字符串,在這種情況下,我使用space ('')。 為了找到第n個出現的空間,我“借用了” Tavis Lovell最初在博客中編寫的函數。 要將值分成多個列,我根據需要使用了substringcharindex和上面的用戶定義函數。

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演示

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM