我在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
仅用于两列输出。
如果还有其他有用的信息,请告诉我。谢谢!
答案 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