如何将多列分为两列?

时间:2018-06-29 13:33:13

标签: sql sybase-ase

我在SybaseASE 15.X数据库中有数据,并且正在尝试查询整洁的数据。数据在Sybase表中的结构如下:

| Name | Foo_A | Foo_B | Foo_C | Bar_A | Bar_B | Bar_C |
--------------------------------------------------------
| abcd |    16 |    32 |    14 |    52 |    41 |    17 |
| ...  |   ... |   ... |   ... |   ... |   ... |   ... |

我正在以某种方式查询数据:

| Name | Class | FooVal | BarVal |
----------------------------------
| abcd | A     |     16 |     52 |
| abcd | B     |     32 |     41 |
| abcd | C     |     14 |     17 |
| ...  | ...   |    ... |    ... |

现在,我已经知道并正在使用UNION ALL,但是做一个看似简单的UNPIVOT会更简洁明了

正如我在该网站,MSDN文档,SAP文档和SQL参考中所读到的一样,UNPIVOT仅用于两列输出。

如果还有其他有用的信息,请告诉我。谢谢!

2 个答案:

答案 0 :(得分:1)

使用UNION ALL

select t.*
from (select Name, 'A' as Class, Foo_A as FooVal, Bar_A as BarVal
      from table 
      union all
      select Name, 'B', Foo_B, Bar_B
      from table 
      union all
      select Name, 'C', Foo_C, Bar_C
      from table
     ) t
order by name;

答案 1 :(得分:1)

Sybase(现在为SAP)ASE不具有unpivot功能(您可能已经知道),并且不支持矢量功能(可以提供一对多的行拆分操作)。 / p>

除了Yogesh的union all解决方案之外,您可能还想查看带有3行伪表(假设您只有3个类)的交叉联接(笛卡尔积)的性能,例如:

-- setup

create table mytable(Name varchar(10), Foo_A int, Foo_B int, Foo_C int, Bar_A int, Bar_B int, Bar_C int)
go

insert mytable values ('abcd',16,32,14,52,41,17)
go

-- main query

select  m.Name,
        p.Class,
        case when p.Class = 'A' then m.Foo_A
             when p.Class = 'B' then m.Foo_B
             when p.Class = 'C' then m.Foo_C
        end as FooVal,
        case when p.Class = 'A' then m.Bar_A
             when p.Class = 'B' then m.Bar_B
             when p.Class = 'C' then m.Bar_C
        end as BarVal

from    mytable m,
        (select 'A' as Class
         union all
         select 'B'
         union all
         select 'C') p

order by m.Name, p.Class
go

 Name       Class FooVal      BarVal
 ---------- ----- ----------- -----------
 abcd       A              16          52
 abcd       B              32          41
 abcd       C              14          17

要了解其工作原理,请运行以下命令查看联接生成的结果集,然后应用case逻辑以查看最终行的生成方式:

select  p.Class, m.*
from    mytable m,
        (select 'A' as Class
         union all
         select 'B'
         union all
         select 'C') p
order by m.Name, p.Class
go