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的方法?可能重复