Unir / Pivotar elementos con la tabla EAV

Tengo una tabla como la siguiente que tendría la descripción del producto

 ╔════╦══════════════╦══════╗
 ║ Id ║ nombre ║ price║
 ╠════╬══════════════╬══════╣
 ║ 1 ║ Apple ║ 23 ║
 ║ 2 ║ camisa ║ 148 ║
 ║ 3 ║ computadora ║ 101 ║
 ║ 4 ║ impresora ║ 959 ║
 ╚════╩══════════════╩══════╝

y otra tabla que contiene los attributes como vinculados por la ID

 ╔════╦══════════════╦══════╗
 ║ Id ║ attr_name ║ Value║
 ╠════╬══════════════╬══════╣
 ║ 1 ║ color ║ rojo ║
 ║ 1 ║ tamaño ║ xl ║
 ║ 1 ║ marca ║ Aplicación ║
 ║ 2 ║ color ║ azul║
 ║ 2 ║ tamaño ║ l ║
 ║ 3 ║ color ║ azul║
 ║ 3 ║ tamaño ║ xxl ║
 ║ 3 ║ marca ║ HP ║
 ╚════╩══════════════╩══════╝

¿Hay alguna manera posible de traer una tabla como la siguiente si sé que el nombre del atributo va a ser solo de tamaño de color y marca?

 ╔════╦══════════╦═══════╦═══════╦══════╦══╗
 ║ id ║ nombre ║ color ║ marca ║ tamaño ║ ║
 ╠════╬══════════╬═══════╬═══════╬══════╬══╣
 ║ 1 ║ manzana ║ rojo ║ aplicación ║ xl ║ ║
 ║ 2 ║ camisa azul ║ azul ║ ║ l ║ ║
 ║ 3 ║ computadora ║ azul ║ HP ║ XXL ║ ║
 ║ 4 ║ impresora ║ ║ ║ ║ ║
 ╚════╩══════════╩═══════╩═══════╩══════╩══╝

Debería poder usar una function de agregado con una expresión CASE para convertir las filas en columnas:

select d.id, d.name, max(case when a.attr_name = 'color' then a.value end) color, max(case when a.attr_name = 'brand' then a.value end) brand, max(case when a.attr_name = 'size' then a.value end) size from product_description d inner join product_attributes a on d.id = a.id group by d.id, d.name; 

Ver SQL Fiddle con demostración .

Como está utilizando Oracle 11g, puede usar la function PIVOT para get el resultado:

 select id, name, Color, Brand, "Size" from ( select d.id, d.name, a.attr_name, a.value from product_description d inner join product_attributes a on d.id = a.id ) src pivot ( max(value) for attr_name in ('color' as Color, 'brand' as Brand, 'size' as "Size") ) p; 

Ver SQL Fiddle con demostración

    Intereting Posts