将行转换为列

时间:2016-08-19 10:08:15

标签: sql sql-server sql-server-2008-r2

我有一张表TableA和2列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| 

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

3 个答案:

答案 0 :(得分:0)

我不太确定,如果我理解你的桌子的内容是对的。难道没有主键或什么? 我假设你展示的内容就是我们所拥有的全部内容:

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'

如果它是一个可变数量的行,我会这样做(假设列的顺序并不重要):

SELECT A FROM TableA
UNION 
SELECT B FROM TableA

然后使用已提到的SQL-Server提供的PIVOT函数

答案 1 :(得分:0)

准确地为5行,否则构建动态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

答案 2 :(得分:0)

您可以使用动态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  |
+====+====+====+====+====+====+====+====+====+=====+
相关问题