使用SQL Server 2000进行数据透视

我整理了一个关于我的问题的示例场景,希望有人能够指出我正确的方向。

我有两张桌子

制品

替代文字

产品元

替代文字

我需要以下结果集

替代文字

过去我们已经成功地使用了以下方法

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 

它也可以是有用的转置聚合与使用…

 SUM(CASE x WHEN 'y' THEN yVal ELSE 0 END) AS SUMYVal 

编辑

还值得注意的是使用ANSI标准的SQL,所以它将跨平台:)

我意识到这是两岁,但它让我感到接受的答案要求使用dynamicSQL和最高的答案是行不通的:

 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 

必须使用一个分组,否则你会得到一个交错的结果。 如果您使用的是分组方式,则必须将不在“分组依据”子句中的每个列包装在聚合函数(或子查询)中。

如果您的数据库引擎是2005年,并且您的数据库处于2000兼容模式,则可以通过从2005年数据库运行查询来解决较低的兼容模式。 通过在查询中使用3部分命名约定来定位2000数据库,例如DatabaseNameHere.dbo.TableNameHere

 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 

使用存储过程在这里: http : //www.sqlteam.com/article/dynamic-cross-tabs-pivot-tables

也检查评论。