将SQL表的一半列重新格式化为类似转置的转换,并将另一半保留为行



我有一个sql表,格式如下:

col1    col2    col3    2000    2001    2002    2003
a        b      c       1       2       3       4
d        e      f       5       6       7       8
g        h      i       9       2       6       8
j        k      l       5       5       7       3

我需要以下格式的输出:

col1    col2    col3    year    amount
a       b       c       2000    1
a       b       c       2001    2
a       b       c       2002    3
a       b       c       2003    4
d       e       f       2000    5
d       e       f       2001    6
d       e       f       2002    7
d       e       f       2003    8
g       h       i       2000    9
g       h       i       2001    2
g       h       i       2002    6
g       h       i       2003    8
j       k       l       2000    5
j       k       l       2001    5
j       k       l       2002    7
j       k       l       2003    3

我尝试了各种类型的连接和交叉连接。它们似乎不起作用。

尝试使用UNPIVOT操作。。。

-- Data setup...
create table dbo.Example (
col1 char(1),
col2 char(1),
col3 char(1),
[2000] int,
[2001] int,
[2002] int,
[2003] int
);
insert dbo.Example (col1, col2, col3, [2000], [2001], [2002], [2003])
values
('a', 'b', 'c', 1, 2, 3, 4),
('d', 'e', 'f', 5, 6, 7, 8),
('g', 'h', 'i', 9, 2, 6, 8),
('j', 'k', 'l', 5, 5, 7, 3);
-- Unpivot query...
select
col1,
col2,
col3,
year,
amount
from dbo.Example raw
unpivot (amount for year in ([2000], [2001], [2002], [2003])) u;

这就产生了结果。。。

ear>c<1>2001>td style="text-align:right;">4>td style="text-align:right;">6>td style="text-align:right;">9>td style="text-align:right;">52001>td style="text align:right;">72003
col1col2col3amount
ab2000
abc2
ac2002年3
ac2003
ef20005
ef2001
ef20027
ef20038
hi2000
hi2001hi20026
hi20038
jkl2000
jkl5
jkl2002
jkl3

与其使用官方的UNPIVOT运算符,不如只使用CROSS APPLY (VALUES

当您有其他联接时,或者如果您想要多个未旋转的柱,这一点尤其有用。

select
t.col1,
t.col2,
t.col3,
v.year,
v.amount
from YourTable t
cross apply (values
([2000], 2000),
([2001], 2001),
([2002], 2002),
([2003], 2003)
) v(amount, year);

最新更新