【发布时间】:2008-11-23 19:42:07
【问题描述】:
我整理了我的问题的示例场景,我希望它足以让有人指出我正确的方向。
我有两张桌子
产品
产品元
我需要以下结果集
【问题讨论】:
标签: sql sql-server tsql sql-server-2000
我整理了我的问题的示例场景,我希望它足以让有人指出我正确的方向。
我有两张桌子
产品
产品元
我需要以下结果集
【问题讨论】:
标签: sql sql-server tsql sql-server-2000
我意识到这已经两年了,但让我感到困扰的是,接受的答案要求使用动态 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 子句中的每一列包装在聚合函数(或子查询)中。
【讨论】:
我们过去曾成功使用过以下方法...
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
【讨论】:
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
【讨论】: