Hemos utilizado con éxito el siguiente enfoque en el pasado ...
SELECT [p].ProductID,
[p].Name,
MAX(CASE [m].MetaKey
WHEN 'A'
THEN [m].MetaValue
END) AS A,
MAX(CASE [m].MetaKey
WHEN 'B'
THEN [m].MetaValue
END) AS B,
MAX(CASE [m].MetaKey
WHEN 'C'
THEN [m].MetaValue
END) AS C
FROM Products [p]
INNER JOIN ProductMeta [m]
ON [p].ProductId = [m].ProductId
GROUP BY [p].ProductID,
[p].Name
También puede ser agregaciones de transposición útiles con el uso de ...
SUM(CASE x WHEN 'y' THEN yVal ELSE 0 END) AS SUMYVal
EDIT
También vale la pena señalar que esto es mediante el estándar ANSI SQL y así funcionará en plataformas :)
Esto solo funciona cuando los valores son estáticos, es decir, usted conoce con anticipación los valores de la columna ... –
una cosa que no entiendo es si necesita usar [m] .metavalue en todos los casos, entonces ¿por qué molestarse con el uso de la caja del interruptor? ¿Puede explicarlo? un poco. – Alex
Porque, por ejemplo, solo desea la suma de [m] .metavalue donde [m] .metakey es 'a' para aparecer en la columna a. Básicamente, filtra todos los demás resultados de metavalor de la suma. De esta forma, puede transponer los datos en las filas originales en columnas. –