|
Pivottare una tabella
Un problema abbastanza frequente riguarda la necessità di "ricostruire" un dataset con i dati
provenienti da una tabella "Master" e da una tabella secondaria che contiene gli attributi del'entità
della tabella Master.
Supponiamo di avere una Tabella contenente i dati di un'entità Master a cui è possibile associare
un numero variabile di attributi definiti precedentemente. Gli attributi con i relativi valori
vengono inseriti in una tabella secondaria. Di seguito riporto una definizione minimale delle
tabelle di partenza e il DataSet che si vuole ottenere.
|
Anagrafica Attributi
AttrPK | AttrName |
1 | Odore |
2 | Colore |
3 | Sapore |
Tabella Master (MasterTable)
MasterPK | MasterID |
1 | Oggetto1 |
2 | Oggetto2 |
3 | Oggetto3 |
Tabella Secondaria (AttributesTable)
MasterPK | AttrPK | Value |
1 | 1 | Acre |
1 | 2 | Rosso |
2 | 2 | Verde |
2 | 3 | Salato |
3 | 1 | Salmastro |
3 | 2 | Giallo |
3 | 3 | Dolce |
Dataset Finale
MasterPK | Odore | Colore | Sapore |
1 | Acre | Rosso | Null |
2 | Null | Verde | Salato |
3 | Salmastro | Giallo | Dolce |
Soluzione "Classica"
SELECT MT.MasterPK,
A1.Value Odore,
A2.Value Colore,
A3.Value Sapore
FROM MasterTable MT
Left Join AttributesTable A1
On MT.MasterPK = A1.MasterPK And A1.AttrPK = 1
Left Join AttributesTable A2
On MT.MasterPK = A2.MasterPK And A2.AttrPK = 2
Left Join AttributesTable A3
On MT.MasterPK = A3.MasterPK And A3.AttrPK = 3
Soluzione Cripto-Performante
SELECT MasterPK,
Max(Case AttrPK When 1 Then Value Else NULL End) Odore,
Max(Case AttrPK When 2 Then Value Else NULL End) Colore,
Max(Case AttrPK When 3 Then Value Else NULL End) Sapore
FROM AttributesTable
GROUP BY MasterPK
Tutte le Utility