2011-07-06 37 views
0

請幫忙解決這個SQL Server問題。我有一名工作人員以及下面列出的字段(請參見粗體顯示員工表)。我想要得到如下所示的結果(請參閱粗體結果)。請幫忙解決這個SQL Server問題

EMPLOYEE表:

Name 
Age 
Salary 
Employee Type 
Employed Date 

員工數據:

Name  Age Salary  Employee_Type Date_Hired 
Employee 1 24 24,000.00 Staff   January 15, 2009 
Employee 2 33 32,000.00 Staff   February 1, 2005 
Employee 3 23 75,000.00 Consultant  March 20, 2002 

結果:

  Employee 1   Employee 2   Employee 3 
Age   24     33     23 
Salary  24,000.00    32,000.00   75,000.00 
Employee_Type Staff     Staff    Consultant 
Date_Hired January 15, 2009  February 1, 2005 March 20, 2002 
+3

這是可以做到,但你添加員工添加列和SQL是不適合,沒有動態SQL。就個人而言,我會在報告或客戶端代碼或Access/Excel樞紐中執行此操作 – gbn

+0

gbn-僅作爲示例。它不會爲員工帶來數百條記錄。它最多隻有10條記錄。我在這個問題中將我的原始表格替換爲Employee,以獲得清晰的視角。 ;) – user335160

+0

@Ocaso Protal-如果我把它放在這裏,你會解決它嗎?我試圖把這個問題只是爲了得到一些想法/解決這個問題或另一種方法來解決這個問題。 – user335160

回答

0
Create Table #Employee (Name Varchar(20), Age TinyInt, Salary SmallMoney, EmployeeType Varchar(20), EmployedDate Date) 

Insert Into #Employee 
Select 'Employee 1', 24, 24000.00, 'Staff', '01/15/2009' Union all 
Select 'Employee 2', 33, 32000.00, 'Staff', '02/01/2005' Union All 
Select 'Employee 3', 23, 75000.00, 'Consultant', '03/20/2002' 

Declare @Names As Varchar(Max), @strSQL Varchar(Max) 
Select @Names = Stuff((Select ',' + QuoteName(Name) From #Employee Order by Name For XML Path('')), 1, 1, '') 
Set @strSQL = ';With CTE As (Select Name, FieldName, FieldValue From (Select Name, Convert(Varchar(20), Age) As Age, Convert(Varchar(20), Salary) As Salary, Convert(Varchar(20), EmployeeType) As EmployeeType, Convert(Varchar(20), EmployedDate, 101) As EmployedDate From #Employee)As p UnPivot (FieldValue For FieldName In (Age, Salary, EmployeeType, EmployedDate))AS unpvt) Select * From CTE Pivot (Max(FieldValue) For Name in (' + @Names + ')) As Pvt' 
print @strSQL 
Execute (@strSQL) 

Drop Table #Employee 

感謝Arbi Baghdanian,:)

+0

高度讚賞任何其他解決方案。:) – user335160

0

這是一種方法。 UNPIVOT用於將列名轉移到行,然後通過ColumnName(現在是一行)的標準分組用於爲每個員工轉換名稱/值組合。請注意,在使用unpivot時,列應該具有相同的數據類型,這就是爲什麼存在轉換和轉換的原因。這種方法唯一的缺點是員工姓名是硬編碼的,但這總是一個問題,除非使用動態透視。但是,既然你提到你只有約10名員工來corsstab,那應該不成問題。這裏是腳本:

select 
    unp.ColumnName, 
    max(case when Name = 'Employee 1' then Value else null end) [Employee 1], 
    max(case when Name = 'Employee 2' then Value else null end) [Employee 2], 
    max(case when Name = 'Employee 3' then Value else null end) [Employee 3] 
    from 
    (
     select 
      Name, cast(Age as varchar(20)) Age, 
      cast(Salary as varchar(20)) Salary, 
      cast(Employee_Type as varchar(20)) Employee_Type, 
      convert(varchar(20), Employed_Date, 106) Employed_Date 
      from dbo.Employee 
    ) src 
    unpivot 
    (
     Value for ColumnName in (
      [Age], [Salary], [Employee_Type], [Employed_Date]) 
    ) unp 
    group by unp.ColumnName; 

-- the above produces something like this for 
-- the data consistent with the sample in question: 

ColumnName   Employee 1   Employee 2   Employee 3 
-------------------- -------------------- -------------------- ----------- 
Age     24     33     23 
Employed_Date  15 Jan 2009   01 Feb 2005   20 Mar 2002 
Employee_Type  Staff    Staff    Consultant 
Salary    24000.00    32000.00    75000.00 

感謝奧列格。 :)

0
Declare @strSQL1 Varchar(Max) 

Declare @Names1 As Varchar(Max) 
Select @Names1 = Stuff((Select ',' + 'max(case when Name = '''+Name+'''then Value else null end)'+ QuoteName(Name) From Employee Order by Name For XML Path('')), 1, 1, '') 
print @Names1 

Set @strSQL1 = 'select 
    unp.ColumnName,'[email protected]+ ' from 
    (
     select 
      Name, cast(Age as varchar(20)) Age, 
      cast(Salary as varchar(20)) Salary, 
      cast(Employee_Type as varchar(20)) Employee_Type, 
      convert(varchar(20), Date_Hired, 106) Date_Hired 
      from dbo.Employee 
    ) src 
    unpivot 
    (
     Value for ColumnName in (
      [Age], [Salary], [Employee_Type], Date_Hired) 
    ) unp 
    group by unp.ColumnName; ' 

print @strSQL1 
Execute (@strSQL1) 

另一種動態的解決方案升級奧列格的解決方案