我有一个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;
这就产生了结果。。。
col1 | col2 | col3 | ear>amount | ||||||
---|---|---|---|---|---|---|---|---|---|
a | b | c2000 | <1>|||||||
a | b | c | 20012 | ||||||
a | c | 2002年 | 3 | ||||||
a | c | 2003 | >td style="text-align:right;">4|||||||
e | f | 2000 | 5 | ||||||
e | f | 2001 | >td style="text-align:right;">6|||||||
e | f | 2002 | 7 | ||||||
e | f | 2003 | 8 | ||||||
h | i | 2000 | >td style="text-align:right;">9|||||||
h | i | 2001 | h | i | 2002 | 6 | |||
h | i | 2003 | 8 | ||||||
j | k | l | 2000 | >td style="text-align:right;">5||||||
j | k | l | 20015 | ||||||
j | k | l | 2002 | >td style="text align:right;">7||||||
j | k | l | 20033 |
与其使用官方的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);