我整理了一个关于我的问题的示例场景,我希望它足以让某人指出我正确的方向.
我有两张桌子
制品
产品元
我需要以下结果集
我意识到这已经有两年了,但它让我觉得接受的答案要求使用动态SQL并且最受欢迎的答案不起作用:
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
您必须使用Group By,否则您将得到错开的结果.如果使用Group By,则必须将不在Group By子句中的每个列包装在聚合函数(或子查询)中.
我们过去成功使用了以下方法......
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,因此它可以跨平台工作:)
如果您的数据库引擎是2005并且您的数据库处于2000兼容模式,则可以通过从2005数据库运行查询来解决较低兼容性模式.通过在查询中使用表的3部分命名约定来定位2000数据库,例如DatabaseNameHere.dbo.TableNameHere