Tsql 如何使用SQL Select查询将行转换为列?

Tsql 如何使用SQL Select查询将行转换为列?,tsql,sql-server-2008-r2,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

主表

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

我怎样才能做到这一点?任何建议都可以提前提出。

这是一个常见的问题,在不知道BDMS使用方法的情况下,我建议两种低级解决方案:

通过联接添加列 通过子选择添加列 逐子选择添加列包括添加一个子选择,以获取您需要传输到列中的每个数据

按连接组添加列将左连接添加到数据,右数据剪切,将所需的ad暴露字段添加到列中


这些解决方案都是静态的,仅当您有固定数量的列要传输时才有效。一种让dinamy进入存储过程的方法。

我希望下面的查询将帮助您实现您想要的

 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。

一些常规/常用策略

您可以使用透视查询

您可以使用CASE TSQL或解码PLSQL类型的语句

SELECT
   ...
   CASE Parmname WHEN 'NameOne' THEN [ValueOne] ELSE '' END as NameOne,
   CASE Parmname WHEN 'NameTwo' THEN [ValueTwo] ELSE '' END as NameTwo
   ...
您可以使用派生表

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
   ...

…等等

ParamName可以有许多值。这不是固定的。没有pivot有什么想法?有没有在SQL存储过程中使用任何应用程序或动态查询的选项?我不能硬编码ParamName,因为它是动态的。还有其他想法吗?@MITHUN-如果您不知道这些列将提前出现什么,那么您必须使用其他查询或WHILE循环等动态构建查询,逐段构建sql字符串,然后执行查询。这可能会变得有点复杂…@MITHUN-你想实现什么/什么会消耗这个查询的输出?也许有一种更简单/非sql的方法?可能重复