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 のいずれかで実行できますか??

4

1 に答える 1

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 |

データがその形式になったら、各テーブルに必要な列に基づいてデータを PIVOT できます。

たとえば、データが必要な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 を参照してください

次に、各クエリの列名を次のテーブルの値に置き換えます。

于 2013-04-09T23:20:30.727 に答える