16

我整理了我的问题的一个示例场景,我希望它足以让有人指出我正确的方向。

我有两张桌子

产品

替代文字

产品元

替代文字

我需要以下结果集

替代文字

4

4 回答 4

24

我意识到这是两年前的事了,但让我感到困扰的是,接受的答案要求使用动态 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 子句中的每一列包装在聚合函数(或子查询)中。

于 2011-04-27T05:23:01.597 回答
14

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

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,因此它可以跨平台工作 :)

于 2008-11-28T16:53:34.173 回答
6

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

于 2010-03-31T21:12:52.880 回答
3
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
于 2008-11-23T20:03:56.833 回答