プロファイルのテーブルがあり、プロファイルのプロパティ値を行スタイルで保存しています。例:
[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
グループ化するだけで、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 [〜#〜]:プロパティの動的な数については SQL SELECTステートメントの値をインクリメントする)を見てください
列に変換する必要のある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 を参照してください。