2013-04-09 62 views
0

我有產生如下圖所示樞軸表創建多個表,名稱中包含列名和文本包含他們的價值觀,所以需要根據相似的價值觀如何從數據透視表

輸入生成多個表表

ID Name text  
1 Name,DOB John,02/02/1980 
2 FirstName,SSN,City Ray,987898789,Chicago 
3 Name,DOB Mary,12/21/1990 
4 FirstName,SSN,City Cary,987000789,Dallas 
5 PersonID,Code,Zip,Gender,Maritial 1234,A456,23456,M,single  
6 PersonID,Code,Zip,Gender,Maritial 1235,A457,23233,M,single  
7 PersonID,Code,Zip,Gender,Maritial 1236,A458,67675,M,Married 

所以輸出表應該像

輸出表1

ID Name DOB 
1 john 02/02/1980 
3 Mary 02/02/1980 

輸出表2

ID FirstName SSN City 
2 Ray 987898789 Chicago 
4 Cary 987000789 Dallas 

輸出表3

ID PersonID Zip Gender Marital 
5 1234 A456 23456 M Single 
6 1235 A457 23233 M Single 
7 1236 A458 67675 M Married 

能有人請幫我在這一個。可以這樣做在Sqlserver或MySQL或SSIS?

+1

只需用手對每個查詢類型進行硬編碼;沒有對此的自動化支持,但它比困難更繁瑣。 – 2013-04-09 22:18:35

回答

2

我的建議是首先規範你的input表。在SQL Server中,您可以使用遞歸CTE將逗號分隔列表中的數據拆分爲多行。

的CTE將類似於以下內容:

;with cte (id, col, Name_list, value, text_list) as 
(
    select id, 
    cast(left(Name, charindex(',',Name+',')-1) as varchar(50)) col, 
     stuff(Name, 1, charindex(',',Name+','), '') Name_list, 
    cast(left(text, charindex(',',text+',')-1) as varchar(50)) value, 
     stuff(text, 1, charindex(',',text+','), '') text_list 
    from input 
    union all 
    select id, 
    cast(left(Name_list, charindex(',',Name_list+',')-1) as varchar(50)) col, 
    stuff(Name_list, 1, charindex(',',Name_list+','), '') Name_list, 
    cast(left(text_list, charindex(',',text_list+',')-1) as varchar(50)) value, 
     stuff(text_list, 1, charindex(',',text_list+','), '') text_list 
    from cte 
    where Name_list > '' 
    or text_list > '' 
) 
select id, col, value 
from cte; 

SQL Fiddle with Demo。這將讓你在格式的數據:

| ID |  COL |  VALUE | 
------------------------------- 
| 1 |  Name |  John | 
| 2 | FirstName |  Ray | 
| 3 |  Name |  Mary | 
| 4 | FirstName |  Cary | 
| 5 | PersonID |  1234 | 

一旦數據在格式,然後你可以樞根據您在每個表所需的列中的數據。

例如,如果你想爲Table1數據,您將使用:

;with cte (id, col, Name_list, value, text_list) as 
(
    select id, 
    cast(left(Name, charindex(',',Name+',')-1) as varchar(50)) col, 
     stuff(Name, 1, charindex(',',Name+','), '') Name_list, 
    cast(left(text, charindex(',',text+',')-1) as varchar(50)) value, 
     stuff(text, 1, charindex(',',text+','), '') text_list 
    from input 
    union all 
    select id, 
    cast(left(Name_list, charindex(',',Name_list+',')-1) as varchar(50)) col, 
    stuff(Name_list, 1, charindex(',',Name_list+','), '') Name_list, 
    cast(left(text_list, charindex(',',text_list+',')-1) as varchar(50)) value, 
     stuff(text_list, 1, charindex(',',text_list+','), '') text_list 
    from cte 
    where Name_list > '' 
    or text_list > '' 
) 
select * 
-- into table1 
from 
(
    select id, col, value 
    from cte 
    where col in ('Name', 'DOB') 
) d 
pivot 
(
    max(value) 
    for col in (Name, DOB) 
) piv; 

SQL Fiddle with Demo

你會再與下一個表中的值替換每個查詢的列名。