繁体   English   中英

使用 SQL Server 2000 进行透视

[英]Pivot using 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,则必须将不在 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

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

还要检查评论。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM