2012-10-27 27 views
8

Ben Profiller bir tablo profil özellikleri satır tarzında değerleri, eski depolayan var:T: SQL: sütun olarak satırları seçin değerler

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

ve mülkiyet tanımları için başka bir tablo:

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

Nasıl bu şekilde göstermek için PIVOT veya başka bir şekilde kullanmak için:

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

cevap

11

Oolmadan bunu yapmak kolay Sadece

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 

gruplayarakanahtar kelime, ayrıca PIVOT anahtar kelime

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 

GÜNCELLEME ile yapabilirsiniz: özelliklerinin dinamik sayıda - Öyle görünüyor Increment value in SQL SELECT statement

+0

Katkınız için teşekkür ederiz, her iki yöntem de bu sorunu çözdü, ancak performansı dikkate alırsak hangisi daha hızlıdır? – Alaa

5

bakmak sütunlara dönüştürmeniz gereken bilinmeyen sayıda PropertyName's olabilir. Eğer durum buysa, o zaman sonuç üretmek için dinamik sql kullanabilirsiniz:

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 bakınız.

+0

, sadece sütunları değişkenlere uydurmanız gerektiğinde 'xml için 'kullanmanıza gerek yoktur. Tablodan veri seçmeye çalışırken güvenlik sorunları da olabilir, örneğin, kullanıcı prosedürde izinlere sahip olabilir, ancak tablolarda izinleri yoktur. Buraya cevabımı bir göz atın - http://stackoverflow.com/questions/13055295/increment-value-in-sql-select-statement/13055403#13055403 –

+1

@RomanPekar sütunları birleştirmenin farklı yolları vardır. kullanmayı seçtiğim yöntem. – Taryn