当前位置:  开发笔记 > 数据库 > 正文

使用SQL Server 2000进行透视

如何解决《使用SQLServer2000进行透视》经验,为你挑选了3个好方法。

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

我有两张桌子

制品

替代文字

产品元

替代文字

我需要以下结果集

替代文字



1> Thomas..:

我意识到这已经有两年了,但它让我觉得接受的答案要求使用动态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子句中的每个列包装在聚合函数(或子查询)中.



2> Rich Andrews..:

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

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



3> AaronLS..:

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

推荐阅读
牛尾巴2010
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有