2012-10-27 9 views
8

Mam tabeli dla profili przechowuje profil właściwości wartości w stylu Row, Ex:T: SQL: wybierz wartości z wierszy jak kolumny

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

i inną tabelę dla definicji własności:

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

Jak korzystać PIVOT lub w jakikolwiek inny sposób, aby pokazać je w ten sposób:

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

Odpowiedz

11

łatwo to zrobić bez PIVOT słów kluczowych, tylko poprzez grupowanie

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 

można też zrobić to z PIVOT hasła

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: Na numer dynamiczne właściwości - przyjrzeć Increment value in SQL SELECT statement

+0

Dzięki za wkład, obie metody rozwiązały ten problem, jednak jeśli weźmiemy pod uwagę wydajność, która z nich jest szybsza? – Alaa

5

to wygląda możesz mieć nieznaną liczbę PropertyName's, którą musisz zmienić w kolumny. Jeśli tak jest, to można użyć dynamicznego SQL wygenerować wynik:

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) 

Zobacz SQL Fiddle with Demo.

+0

nie musisz używać 'dla xml', gdy potrzebujesz tylko dołączyć kolumny do zmiennej. Podczas próby wybrania danych z tabeli mogą również wystąpić problemy z zabezpieczeniami, na przykład użytkownik może mieć uprawnienia do procedury, ale nie ma uprawnień do tabel. Spójrz na moją odpowiedź tutaj - http://stackoverflow.com/questions/13055295/increment-value-in-sql-select-statement/13055403#13055403 –

+1

@RomanPekar Istnieje wiele różnych sposobów łączenia kolumn, to jest metodą, którą wybieram. – Taryn