Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/81.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 将行转换为列_Sql_Sql Server_Sql Server 2008 R2 - Fatal编程技术网

Sql 将行转换为列

Sql 将行转换为列,sql,sql-server,sql-server-2008-r2,Sql,Sql Server,Sql Server 2008 R2,我有一个表TableA,有两列a和B,其中有条目 表A |A||B| |A1|B1| |A2|B2| |A3|B3| |A4|B4| |A5|B5| 我想把它分成10列,列名不同,如下所示 |E1|E2|E3|E4|E5|E6|E7|E8|E9|E10| |A1|B1|A2|B2|A3|B3|A4|B4|A5|B5| 它是与不同表关联的查询的一部分,这些表显示了与此表数据的关联。它获取我希望在一行中显示的多个行值 我不太确定,我是否正确理解了你们桌子上的内容。难道没有主键之类

我有一个表TableA,有两列a和B,其中有条目

表A

|A||B|

|A1|B1|

|A2|B2|

|A3|B3|

|A4|B4|

|A5|B5| 
我想把它分成10列,列名不同,如下所示

|E1|E2|E3|E4|E5|E6|E7|E8|E9|E10|

|A1|B1|A2|B2|A3|B3|A4|B4|A5|B5| 

它是与不同表关联的查询的一部分,这些表显示了与此表数据的关联。它获取我希望在一行中显示的多个行值

我不太确定,我是否正确理解了你们桌子上的内容。难道没有主键之类的东西吗? 我假设你展示的内容就是我们所有的:

SELECT a1.A AS E1, a1.B AS E2, a2.A AS E3, a2.B AS E4, a3.A AS E5, a3.B AS E6
    a4.A AS E7, a4.B AS E8, a5.A AS E9, a5.B AS E10
FROM TableA a1
JOIN TableA a2 ON a2.A = 'A2'
JOIN TableA a3 ON a3.A = 'A3'
JOIN TableA a4 ON a4.A = 'A4'
JOIN TableA a5 ON a5.A = 'A5'
如果行数可变,我会这样做(假定列的顺序无关紧要):


然后使用前面提到的SQL Server为5行提供的
PIVOT
函数,否则构建动态SQL

with t as (
  select *, rn=row_number() over(order by A,B) 
  from theTable
)
select 
    r1.A as E1, r1.B as E2, 
    r2.A as E3, r1.B as E4, 
    r1.A as E5, r1.B as E6, 
    r2.A as E7, r1.B as E8, 
    r5.A as E9, r5.B as E10
from t as r1 
join t as r2 on r2.rn=2
join t as r3 on r3.rn=3
join t as r4 on r4.rn=4
join t as r5 on r5.rn=5
where r1.rn=1

您可以通过动态sql查询来实现这一点

对于结果集列名中的数字序列,我们必须添加一个额外的列

查询

DECLARE @sql AS varchar(max);

SELECT @sql = 'select ' + STUFF((SELECT
    ',max(case A when ''' + A + ''' then ''' + A + ''' end) as E' 
        + CAST(E AS varchar(10)) +
    ',max(case B when ''' + B + ''' then ''' + B + ''' end) as E' 
        + CAST((E + 1) AS varchar(10))
  FROM (SELECT
    (ROW_NUMBER() OVER (
    ORDER BY A
    ) * 2 + 1) - 2 AS E, *
  FROM TableA) t
  FOR xml PATH (''))
  , 1, 1, '') + ' from TableA;';

EXEC (@sql);
结果

+====+====+====+====+====+====+====+====+====+=====+
| E1 | E2 | E3 | E4 | E5 | E6 | E7 | E8 | E9 | E10 |
+----+----+----+----+----+----+----+----+----+-----+
| A1 | B1 | A2 | B2 | A3 | B3 | A4 | B4 | A5 | B5  |
+====+====+====+====+====+====+====+====+====+=====+

查找sql pivot,有很多示例如果将更多行添加到表中,预期结果是什么?您必须使用pivot获取列中的行看看Ms sql pivot一次不能转置超过1列。此外,它还需要枚举枚举必须由所有表值组成的值。
+====+====+====+====+====+====+====+====+====+=====+
| E1 | E2 | E3 | E4 | E5 | E6 | E7 | E8 | E9 | E10 |
+----+----+----+----+----+----+----+----+----+-----+
| A1 | B1 | A2 | B2 | A3 | B3 | A4 | B4 | A5 | B5  |
+====+====+====+====+====+====+====+====+====+=====+