如何重组行?

时间:2018-07-05 15:35:54

标签: sql-server-2012

我的数据格式为

Id  Value
1   a
2   b
3   c
4   d
5   e
6   f
7   g
8   h
9   i
10  j
11  k
12  l
13  m
14  n
15  o
16  p

我希望它显示为

1   a        5   e        9   i        13  m
2   b        6   f        10  j        14  n
3   c        7   g        11  k        15  o
4   d        8   h        12  l        16  p

所以我想将2x16的桌子变成8x4的桌子

如果可能的话,我想完全排除列标题,并排除数字列,但仍将其用于排序。

我该如何实现?

2 个答案:

答案 0 :(得分:0)

如果演示文稿软件可以旋转数据,则可以使用在row_number列上排序的Id并为所需的行数取模,来为所需的列布局提供分组值:

declare @t table(Id int,Value varchar(1));
insert into @t values(1,'a'),(2,'b'),(3,'c'),(4,'d'),(5,'e'),(6,'f'),(7,'g'),(8,'h'),(9,'i'),(10,'j'),(11,'k'),(12,'l'),(13,'m'),(14,'n'),(15,'o'),(16,'p');

select Id
    ,Value
    ,(row_number() over (order by Id)-1) % 4 as ColGroup
from @t
order by Id;

输出:

+----+-------+----------+
| Id | Value | ColGroup |
+----+-------+----------+
|  1 | a     |        0 |
|  2 | b     |        1 |
|  3 | c     |        2 |
|  4 | d     |        3 |
|  5 | e     |        0 |
|  6 | f     |        1 |
|  7 | g     |        2 |
|  8 | h     |        3 |
|  9 | i     |        0 |
| 10 | j     |        1 |
| 11 | k     |        2 |
| 12 | l     |        3 |
| 13 | m     |        0 |
| 14 | n     |        1 |
| 15 | o     |        2 |
| 16 | p     |        3 |
+----+-------+----------+

-1可以确保ColGroup值从第一列而不是第二列开始。

答案 1 :(得分:0)

根据了解,

create table #t (Id int,Value varchar(1));
insert into #t values(1,'a'),(2,'b'),(3,'c'),(4,'d'),(5,'e'),(6,'f'),(7,'g'),(8,'h'),(9,'i'),(10,'j'),(11,'k'),(12,'l'),(13,'m'),(14,'n'),(15,'o'),(16,'p');

select ot.Id1 '1', ot.Id2 '2', thf.Id3 '3', thf.Id4 '4' 
from(
 select * from(
  select Id Id1, Value Value1  from #t
 )o 
 join (
  select Id Id2, Value Value2 from #t
 )t 
 on o.Id1 = t.Id2 - 4
)ot
join(
 select * from(
  select Id Id3, Value Value3 from #t
 )th                              
 join (                           
  select Id Id4, Value Value4 from #t
 )f
 on th.Id3 = f.Id4 - 4
)thf
on ot.Id2 = thf.Id3 - 4

您的id列必须在int列中。如果不是int列,则可以在条件中使用row_number()代替id列。

select Id Id3, Value Value3, ROW_NUMBER() over(order by id) rn3 from #t
//join query
on th.rn3 = f.rn4 - 4

让我知道,你有什么..!

谢谢, 泰米尔语(TamilPugal)