2012-10-27 60 views
8

我的配置文件的表存儲行樣式配置文件屬性值,例如:T:SQL:從行作爲列選擇值

[ProfileID]  [PropertyDefinitionID]  [PropertyValue] 
1    6       Jone 
1    7       Smith 
1    8       Mr 
1    3       50000 

,另一個表屬性定義:

[PropertyDefinitionID] [PropertyName] 
6      FirstName 
7      LastName 
8      Prefix 
3      Salary 

如何使用PIVOT或任何其他方式來顯示它在這樣:

[ProfileID] [FirstName] [LastName] [Salary] 
1   Jone  Smith  5000 

回答

11

這很容易做到這一點沒有PIVOT關鍵字,只是分組

select 
    P.ProfileID, 
    min(case when PD.PropertyName = 'FirstName' then P.PropertyValue else null end) as FirstName, 
    min(case when PD.PropertyName = 'LastName' then P.PropertyValue else null end) as LastName, 
    min(case when PD.PropertyName = 'Salary' then P.PropertyValue else null end) as Salary 
from Profiles as P 
    left outer join PropertyDefinitions as PD on PD.PropertyDefinitionID = P.PropertyDefinitionID 
group by P.ProfileID 

你也可以用PIVOT關鍵字

select 
    * 
from 
(
    select P.ProfileID, P.PropertyValue, PD.PropertyName 
    from Profiles as P 
     left outer join PropertyDefinitions as PD on PD.PropertyDefinitionID = P.PropertyDefinitionID 
) as P 
    pivot 
    (
     min(P.PropertyValue) 
     for P.PropertyName in ([FirstName], [LastName], [Salary]) 
    ) as PIV 

UPDATE做到這一點:對於性能的動態數 - 看看Increment value in SQL SELECT statement

+0

感謝您的貢獻,兩種方法都解決了這個問題,但是如果我們考慮性能,哪個更快? – Alaa

5

它看起來像你可能有一個未知數PropertyName's,你需要把它變成列。如果是這樣的話,那麼你可以使用動態sql來產生結果:

DECLARE @cols AS NVARCHAR(MAX), 
    @query AS NVARCHAR(MAX) 

select @cols = STUFF((SELECT distinct ',' + QUOTENAME(PropertyName) 
        from propertydefinitions 
      FOR XML PATH(''), TYPE 
      ).value('.', 'NVARCHAR(MAX)') 
     ,1,1,'') 

set @query = 'SELECT profileid, ' + @cols + ' from 
      (
       select p.profileid, 
        p.propertyvalue, 
        d.propertyname 
       from profiles p 
       left join propertydefinitions d 
        on p.PropertyDefinitionID = d.PropertyDefinitionID 
      ) x 
      pivot 
      (
       max(propertyvalue) 
       for propertyname in (' + @cols + ') 
      ) p ' 

execute(@query) 

請參閱SQL Fiddle with Demo

+0

當你只需要將列連接到變量時,你不需要使用'for xml'。當您嘗試從表中選擇數據時,也可能存在安全問題,例如,用戶可以擁有過程權限,但對錶沒有權限。看看我的答案在這裏 - http://stackoverflow.com/questions/13055295/increment-value-in-sql-select-statement/13055403#13055403 –

+1

@RomanPekar有各種不同的方式來連接列,這是我選擇使用的方法。 – Taryn