Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sql-server-2005/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 将列转换为SQL Server中的行_Sql Server_Sql Server 2005_Unpivot - Fatal编程技术网

Sql server 将列转换为SQL Server中的行

Sql server 将列转换为SQL Server中的行,sql-server,sql-server-2005,unpivot,Sql Server,Sql Server 2005,Unpivot,如果要转换为行的列都以列名中的前缀“c”开头,如何动态地将某些列转换为行。我有一张桌子如下 DECLARE @t codes ( Tax CHAR(5), ptype CHAR(2), c1 CHAR(1), c2 char(1), c3 char(1) ) insert into @t (tax, ptype, c1, c2, c3) values ('AAAAA','10',Null, 1,2) insert into @t (tax, ptype, c1, c2,

如果要转换为行的列都以列名中的前缀“c”开头,如何动态地将某些列转换为行。我有一张桌子如下

DECLARE @t codes 
(
  Tax CHAR(5),
  ptype CHAR(2),
  c1 CHAR(1),
  c2 char(1),
  c3 char(1)
)

insert into @t (tax, ptype, c1, c2, c3) values ('AAAAA','10',Null, 1,2)
insert into @t (tax, ptype, c1, c2, c3) values ('BBBBB','21',3, 1,NULL)
insert into @t (tax, ptype, c1, c2, c3) values ('ZZZZZ','1',NULL, NULL, 2)
insert into @t (tax, ptype, c1, c2, c3) values ('CCCCC',NULL,1,3,4)
insert into @t (tax, ptype, c1, c2, c3) values ('YYYYY','4',NULL, NULL, NULL)
insert into @t (tax, ptype, c1, c2, c3) values ('DDDDD','8',2,5,6)
如果ptype不是'NULL',当c1、c2、c3不是'NULL',且c1、c2、c3值按升序排序时,我如何输出以下内容

Tax   ptype  Columns value
----- -----  ------- -----
AAAAA 10     c2      1
AAAAA 10     c3      2 
BBBBB 21     c2      1
BBBBB 21     c1      3 
ZZZZZ 1      c3      2
DDDDD 8      c1      2 
DDDDD 8      c2      5
DDDDD 8      c3      6

我将使用
交叉应用
表值构造函数
来取消对数据的抽取

SELECT tax, 
       ptype, 
       columns, 
       value 
FROM   @t 
       CROSS apply (Select 'c1',c1 
                    UNION ALL 
                    Select 'c2',c2 
                    UNION ALL
                    Select 'c3',c3 ) cs(columns, value) 
WHERE  ptype IS NOT NULL 
       AND columns IS NOT NULL 
       AND value IS NOT NULL 

查询 结果集 如果要从结果集中消除空值,只需将where子句添加到上述查询中

WHERE [Columname] IS NOT NULL

你的输出一点也不清楚。是否需要文字值“C2”等。如果您能清楚地解释您的输出,我们可以提供帮助。@SeanLange我需要“Columns”中的列名。我将编辑OP以澄清。谢谢Hanks@Indian,但我在SQL serve 2005上,我相信CROSS apply不会work@user176047交叉应用是在2005年引入的,所以只要您的数据库兼容性级别设置为90,它就可以工作。@user176047-Ali是正确的<代码>交叉应用于2005年推出。但问题在于2008年引入的表值构造函数
。现在更新了代码检查。这就是为什么您应该在问题中添加适当的标记。我发现使用UNPIVOT更容易,因为这种语法是针对这种情况引入的;)
╔═══════╦═══════╦═════════╦═══════╗
║  Tax  ║ ptype ║ Columns ║ Value ║
╠═══════╬═══════╬═════════╬═══════╣
║ AAAAA ║ 10    ║ c2      ║     1 ║
║ AAAAA ║ 10    ║ c3      ║     2 ║
║ BBBBB ║ 21    ║ c1      ║     3 ║
║ BBBBB ║ 21    ║ c2      ║     1 ║
║ ZZZZZ ║ 1     ║ c3      ║     2 ║
║ CCCCC ║ NULL  ║ c1      ║     1 ║
║ CCCCC ║ NULL  ║ c2      ║     3 ║
║ CCCCC ║ NULL  ║ c3      ║     4 ║
║ DDDDD ║ 8     ║ c1      ║     2 ║
║ DDDDD ║ 8     ║ c2      ║     5 ║
║ DDDDD ║ 8     ║ c3      ║     6 ║
╚═══════╩═══════╩═════════╩═══════╝
WHERE [Columname] IS NOT NULL