2017-01-30 3 views
2

我々は、複数の列の行がSQLピボット行が

http://sqlfiddle.com/#!6/d4eb9

Create table #Temp_Trans  

( 
P_ID int, 
Custom_Name varchar(30),  
Text_Value varchar(30), 
Number_Value int, 
[DateTime] datetime,  

) 

insert into #Temp_Trans values 
(1111,'DepartmentCode','AAA',null,null),  
(1111,'Year','2017',null,null), 
(1111,'StartDate',null,null,'2002-10-02'), 
(1111,'EmpID',null,555,null), 
(1111,'EmpTitle','TeamLeader',null,null), 

(2222,'DepartmentCode','BBB',null,null),  
(2222,'Year','2016',null,null), 
(2222,'StartDate',null,null,'2010-10-02'), 
(2222,'EmpID',null,null,null), 
(2222,'EmpTitle',null,null,null), 

(3333,'DepartmentCode','CCC',null,null),  
(3333,'Year','2017',null,null), 
(3333,'StartDate',null,null,'2017-10-02') 

select * from #Temp_Trans 
enter image description hereまたは、他の方法ですなわち旋回することができます。ほとんどのレコード(p_id)は固定数の列(カスタム名)の見出しを持ちます。多くの感謝

答えて

2

これを試してください。彼らはちょっとファンキーなので、自分でピボットを読んでみることをお勧めします。 https://technet.microsoft.com/en-us/library/ms177410(v=sql.105).aspx

複数の列にまたがって処理しようとすると、すべての列が単一のデータ型(文字列)にまとまっていることに気付くことがあります。それでもデータ型を強制する必要がある場合は、最後に選択します。

select 
    p_id, 
    DepartmentCode = cast(DepartmentCode as varchar(30)), 
    Year = cast(Year as int), 
    StartDate = cast(StartDate as datetime), 
    EmpId = cast(EmpId as int), 
    EmpTitle = cast(EmpTitle as varchar(30)) 
from (select 
      P_ID, 
      custom_name, 
      Value = coalesce(text_value, cast(number_value as varchar(30)), convert(varchar(30), datetime, 120)) 
     from #Temp_Trans) s 
pivot(max(Value) for custom_name in (DepartmentCode, Year, StartDate, EmpID,EmpTitle))p 

何らかの理由で複数の列をピボットする必要がある場合は、複数のピボットを行う必要があります。

+0

私は暴勇ローズバッドを見たことがない複数のピボット(ファンキーを行います)。私は間違いなくこのポストを確認します。 – Smandoli

+0

多くのおかげでXedniはSQLフィドルをテストします。また、リンクを読む予定です。 – Rosebud

+1

ありがとうXedniそれはうまく動作します。 Number_Valの中には0(ゼロ)のデータがあります。つまり、StartDate Null、0、2010-10-02は0を返します。0の値をスキップして、日付を返します。 – Rosebud

2

つ迅速オプション:

1)条件付き集約

select P_ID 
     ,DepartmentCode = max(case when Custom_Name='DepartmentCode' then Text_Value end) 
     ,Year   = max(case when Custom_Name='Year'   then Text_Value end) 
     ,StartDate  = max(case when Custom_Name='StartDate'  then DateTime end) 
     ,EmpID   = max(case when Custom_Name='EmpID'   then Number_Value end) 
     ,EmpTitle  = max(case when Custom_Name='EmpTitle'  then Text_Value end) 
from #Temp_Trans 
Group By P_ID 

2)動的ピボット

Declare @SQL varchar(max) 
Select @SQL = Stuff((Select Distinct ',' + QuoteName(Custom_Name) From #Temp_Trans For XML Path('')),1,1,'') 
Select @SQL = 'Select P_ID,' + @SQL + ' 
       From (
         Select P_ID 
          ,ITEM = Custom_Name 
          ,Value = concat(Text_Value,Number_Value,format(DateTime,''yyyy-MM-dd'')) 
         From #Temp_Trans 
        ) A 
       Pivot (max(Value) For Item in (' + @SQL + ')) p' 
Exec(@SQL); 
+0

多くのありがとうジョンはそれに行きます – Rosebud