【问题标题】:SQL - Interchange rows and columnsSQL - 交换行和列
【发布时间】:2018-02-08 12:20:04
【问题描述】:

我有一个需要交换行和列的情况。是的,我尝试过使用 Pivot 和 UnPivot,但这并没有给我想要的结果。

我的源表:

+-------+------+------+-----+-----+
| month | year | po1  | po2 | po3 |
+-------+------+------+-----+-----+
| Jan   | 2013 |  100 |  20 |  10 |
| Feb   | 2014 | 1100 | 120 | 110 |
+-------+------+------+-----+-----+

我能够制作一个静态枢轴

select Description,value from #test
unpivot (value for Description in (year,po1, po2, po3)) unpiv;

这是我能够生成的结果

+-------------+-------+
| Description | value |
+-------------+-------+
| year        |  2013 |
| po1         |   100 |
| po2         |    20 |
| po3         |    10 |
| year        | 12013 |
| po1         |  1100 |
| po2         |   120 |
| po3         |   110 |
+-------------+-------+

预期输出:

+------+------+------+
| Desc | Jan  | Feb  |
+------+------+------+
| year | 2013 | 2014 |
| po1  |  100 | 1100 |
| po2  |   20 |  120 |
| po3  |   10 |  110 |
+------+------+------+

此外,行/列会不断变化,有没有办法让它动态?

【问题讨论】:

标签: sql sql-server pivot unpivot


【解决方案1】:

这种转置很痛苦——需要旋转和不旋转。这是一种方法:

select v.description,
       max(case when t.month = 'Jan' then v.value end) as Jan,
       max(case when t.month = 'Feb' then v.value end) as Feb
from #test t cross apply
     (values ('year', t.year), ('p01', p01), ('p02', p02), ('p03', p03)
     ) v(description, value) 
group by v.description;

【讨论】:

  • 是的,先生,好痛苦。不过谢谢,但有没有办法动态地做到这一点?
  • @Chendur 如果有办法静态地做到这一点,那么就有办法动态地做到这一点。你只需要充分利用T-SQL!编码愉快!
  • @Chendur 。 . .对我来说,复制 12 个月的行似乎比动态表达要简单得多。
  • @JohnBell Totaly,但任何线索都会很有帮助
  • @Chendur 。 . .更具体地说,这回答了您提出的问题。如果您想要动态版本,请再问一个问题。
猜你喜欢
  • 2021-09-13
  • 2020-02-19
  • 2019-11-16
  • 1970-01-01
  • 2022-01-17
  • 1970-01-01
  • 2016-01-05
  • 2021-11-09
相关资源
最近更新 更多