PIVOT e UNPIVOT

Da Webmobili Wiki.
Versione del 15 gen 2025 alle 18:28 di SimoneVincenzi (discussione | contributi)
(diff) ← Versione meno recente | Versione attuale (diff) | Versione più recente → (diff)

La PIVOT è una funzione che consente di trasformare le righe in colonne.

Vediamo un esempio con la tabella LocalizedProperty

SELECT
	EntityId,
	[Name],
	[Description],
	[ShortDescription],
	[MetaTitle],
	[MetaDescription],
	[SeoName],
	[SeoDescription]
FROM (
	SELECT
		EntityId,
    LocaleKey,
    LocaleValue
	FROM LocalizedProperty
	WHERE LocaleKeyGroup = 'Category' AND LanguageId = 1) AS SourceTable
PIVOT (
	MAX(LocaleValue)
	FOR LocaleKey IN (
		[Name],
		[Description],
		[ShortDescription],
		[MetaTitle],
		[MetaDescription],
		[SeoName],
		[SeoDescription])) AS PivotTable

Lo stesso esempio si può riprodurre utilizzando le funzioni CASE + MAX

SELECT 
	EntityId,
	MAX(CASE WHEN LocaleKey = 'Name' THEN LocaleValue END) AS [Name],
	MAX(CASE WHEN LocaleKey = 'Description' THEN LocaleValue END) AS [Description],
	MAX(CASE WHEN LocaleKey = 'ShortDescription' THEN LocaleValue END) AS [ShortDescription],
	MAX(CASE WHEN LocaleKey = 'MetaTitle' THEN LocaleValue END) AS [MetaTitle],
	MAX(CASE WHEN LocaleKey = 'MetaDescription' THEN LocaleValue END) AS [MetaDescription],
	MAX(CASE WHEN LocaleKey = 'SeoName' THEN LocaleValue END) AS [SeoName],
	MAX(CASE WHEN LocaleKey = 'SeoDescription' THEN LocaleValue END) AS [SeoDescription]
FROM LocalizedProperty
WHERE LocaleKeyGroup = 'Category' AND LanguageId = 1
GROUP BY EntityId

Tra i 2 scenari vince la PIVOT quando ci sono tanti dati, altrimenti sono simili.