如何使用SQL Select Query将行转换为列?

时间:2014-04-28 16:16:08

标签: tsql sql-server-2008-r2

主表

Code   UserName

1      UserOne

2      UserTwo

3      UserThree

详细信息表

Code  UserCode  ParamName  ParamValue

1  1  NameOne  ValueOne

1  1  NameTwo  ValueTwo

1  1  NameThree  ValueThree

等等

以上是我的主人和详细信息表。我想编写一个查询,将详细信息表的行转换为列。所需的输出如下:

Code  UserCode  NameOne  NameTwo  NameThree     and so on

1  1  ValueOne  ValueTwo  ValueThree     and so on

我怎样才能做到这一点?任何建议都会提前很好。

3 个答案:

答案 0 :(得分:0)

这是一个常见的问题,不知道任何关于BDMS的使用,我建议两个低级解决方案:

  1. 通过JOIN添加列
  2. 通过subselect
  3. 添加列

    通过subselect添加列包括添加子选择以获取每个dato,您需要将其转换为列。

    通过JOIN添加列包括向数据添加左连接(白方右侧数据剪切),将所需的广告公开字段添加到列中。

    这些解决方案都是静态的,只有在具有固定数量的traspsose列时才有效。让dinamy可以介绍商店程序的方法。

答案 1 :(得分:0)

我希望以下查询可以帮助您实现您想要的目标

 SELECT DISTINCT
    (SELECT ParamValue FROM tblDetails WHERE ParamName ='TestOne' AND UserCode = tb.UserCode) AS TestOne,
    (SELECT ParamValue FROM tblDetails WHERE ParamName ='TestTwo' AND UserCode = tb.UserCode) AS TestTwo,
    (SELECT ParamValue FROM tblDetails WHERE ParamName ='TestThree' AND UserCode = tb.UserCode) AS TestThree
 FROM tblDetails tb

或者如果ParamName可以包含许多无法提前保证的值,则可以使用PIVOT

答案 2 :(得分:0)

一些一般/共同的策略......

您可以使用PIVOT查询...

您可以使用CASE(TSQL)或DECODE(PLSQL)类型的语句...

SELECT
   ...
   CASE Parmname WHEN 'NameOne' THEN [ValueOne] ELSE '' END as NameOne,
   CASE Parmname WHEN 'NameTwo' THEN [ValueTwo] ELSE '' END as NameTwo
   ...

您可以使用DERIVED TABLES ...

SELECT
   ...
   N1.Parmname,
   N2.Parmname,
   ...
FROM
   ...
   LEFT JOIN (SELECT * FROM tbl_Detail WHERE Parmname = 'NameOne') N1   
   ON...
   LEFT JOIN (SELECT * FROM tbl_Detail WHERE Parmname = 'NameTwo') N2
   ...

...诸如此类