[英]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;
同樣,如您在上面看到的,您將需要使用某種聚合函數來使用數據透視。 希望這可以幫助!
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;
此方法的竅門是,首先使用帶有XML Path
的STUFF
函數創建一個逗號分隔的值列表。 然后,根據字符串分隔符的位置斷開字符串,在這種情況下,我使用space
('')。 為了找到第n個出現的空間,我“借用了” Tavis Lovell最初在博客中編寫的函數。 要將值分成多個列,我根據需要使用了substring
, charindex
和上面的用戶定義函數。
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;
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.