I have 3 tables that hold items properties, because each group of items can have different number of properties I hold them as key-value.
Table Package
| ID | Name |
| 1 | TVs |
| 2 | Laptops |
Table PackageItem
| ID | PackageId | Description |
| 1 | 1 | Samsung TV |
| 2 | 1 | Sony TV |
| 3 | 2 | Apple laptop |
| 4 | 2 | Lenovo |
Table PackageItemDetail
| ID | PackageItemId | Key | Value | PropertyOrder |
| 1 | 1 | Brand | Samsung | 1 |
| 2 | 1 | Size | 42 inch | 2 |
| 3 | 1 | Power consumption | A+ | 3 |
| 4 | 1 | Remote | Smart | 5 |
| 5 | 1 | Weight | 15kg | 4 |
| 6 | 2 | Brand | Sony | 1 |
| 7 | 2 | Size | 50 inch | 2 |
| 8 | 2 | Power consumption | A+++ | 3 |
| 9 | 2 | Remote | Standard | 5 |
| 10 | 2 | Weight | 20kg | 4 |
| 11 | 3 | Brand | Apple | 1 |
| 12 | 3 | Procesor | Intel | 2 |
| 13 | 4 | Brand | Lenovo | 1 |
| 14 | 4 | Procesor | Intel I7 | 2 |
If I select items and their properties for specific package using those queries:
SELECT PID.[Key], PID.[Value] FROM PackageItemDetail PID (NOLOCK) JOIN PackageItem PI (NOLOCK) ON PID.PackageItemId=PI.Id
WHERE PI.PackageId=1 ORDER BY PID.PackageItemId, PID.PropertyOrder;
SELECT PID.[Key], PID.[Value] FROM PackageItemDetail PID (NOLOCK) JOIN PackageItem PI (NOLOCK) ON PID.PackageItemId=PI.Id
WHERE PI.PackageId=2 ORDER BY PID.PackageItemId, PID.PropertyOrder;
Each Package always have same number or properties, so TVs have 5 properties and Laptops have 2 properties.
I'd like to transform those tables into those:
| Brand | Size | Power consumption | Weight | Remote |
| Samsung | 42 inch | A+ | 15kg | Smart |
| Sony | 50 inch | A+++ | 20kg | Standard |
| Brand | Procesor |
| Apple | Intel |
| Lenovo | Intel I7 |
I was able to create simple Pivot using:
SELECT
[Brand]
,[Procesor]
FROM
( SELECT
PI.[Id]
,PID.[Key]
,PID.[Value]
FROM
PackageItemDetail PID ( NOLOCK )
JOIN PackageItem PI ( NOLOCK ) ON PID.PackageItemId = PI.Id
WHERE
PI.PackageId = 2
) AS SourceTable PIVOT
( MAX(Value) FOR [Key] IN ( [Brand], [Procesor] ) ) AS PivotTable;
but this way I must specify properties by hand, but I'd like to have them dynamic (so same query will work for different packages)
I've created SQL Fiddle with sample data: http://sqlfiddle.com/#!18/e8c51/1