que - Pivot usando SQL Server 2000
pivot sql server ejemplo (5)
Arreglé un escenario de muestra de mi problema y espero que sea suficiente para que alguien me señale la dirección correcta.
Tengo dos mesas
Productos
Producto Meta
Necesito un conjunto de resultados de los siguientes
utilice el procedimiento almacenado aquí: http://www.sqlteam.com/article/dynamic-cross-tabs-pivot-tables
también revisa los comentarios.
Select a.ProductId
,a.Name
,(Select c.MetaValue
From [Product Meta] c
Where c.ProductId = a.ProductId
And c.MetaKey = ''A'') As ''A''
,(Select d.MetaValue
From [Product Meta] d
Where d.ProductId = a.ProductId
And d.MetaKey = ''B'') As ''B''
,(Select e.MetaValue
From [Product Meta] e
Where e.ProductId = a.ProductId
And e.MetaKey = ''C'') As ''C''
From Products a
Order By a.ProductId Asc
Si su motor de base de datos es 2005 y su base de datos está en modo de compatibilidad 2000, puede trabajar en el modo de compatibilidad inferior ejecutando su consulta desde una base de datos de 2005. Apunte a la base de datos 2000 utilizando la convención de nomenclatura de 3 partes para sus tablas en la consulta, como DatabaseNameHere.dbo.TableNameHere
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 útil transponer agregaciones con el uso de ...
SUM(CASE x WHEN ''y'' THEN yVal ELSE 0 END) AS SUMYVal
EDITAR
También vale la pena señalar que esto es el uso de SQL estándar ANSI y por lo tanto funcionará en todas las plataformas :)
Me doy cuenta de que esto tiene dos años, pero me molesta que la respuesta aceptada requiera el uso de SQL dinámico y la respuesta más votada no funcionará:
Select P.ProductId, P.Name
, Min( Case When PM.MetaKey = ''A'' Then PM.MetaValue End ) As A
, Min( Case When PM.MetaKey = ''B'' Then PM.MetaValue End ) As B
, Min( Case When PM.MetaKey = ''C'' Then PM.MetaValue End ) As C
From Products As P
Join ProductMeta As PM
On PM.ProductId = P.ProductId
Group By P.ProductId, P.Name
Debe usar un Agrupar por o obtendrá un resultado escalonado. Si está utilizando un Agrupar por, debe ajustar cada columna que no está en la cláusula Agrupar por en una función agregada (o una subconsulta).