【问题标题】:Query to display output horizontally查询以水平显示输出
【发布时间】:2012-09-08 07:18:31
【问题描述】:

我需要以水平方式显示查询输出。我有一些示例数据

create table TestTable (id number, name varchar2(10))

insert into TestTable values (1, 'John')
insert into TestTable values (2, 'Mckensy')
insert into TestTable values (3, 'Valneech')
insert into TestTable values (4, 'Zeebra')

commit

select * from TestTable

这会在垂直视图中获取输出。

ID Name
==========
1  John
2  Mckensy
3  Valneech
4  Zeebra

但是,我需要水平显示。

ID   1    2       3        4
Name John Mckensy Valneech Zeebra

如何做到这一点?

【问题讨论】:

  • 这更像是一个显示格式问题,你为什么希望数据像这样从数据库中出来,当然通过一些报告服务在前端这样做会更容易。
  • 嗨,勇士,谢谢。对于我的要求后端数据非常少。我们没有使用任何报告工具。如果我通过查询获得数据,我的工作就完成了 100% 。所以我需要那个查询。谢谢。

标签: sql oracle pivot


【解决方案1】:

要旋转,您应该使用 select 语句的 pivot clause

select *
  from testtable
 pivot ( max(name)
         for id in (1,2,3,4)
       )

这在 SQL 中并不是特别漂亮,所以你应该仔细考虑这是否是你想要做的。我通常使用Oracle Base 来进行旋转示例,但那里有很多。

这里有一个小SQL Fiddle 来演示。

【讨论】:

  • SQL Fiddle 链接不再有效,但根据发布此答案的时间,任何人都没有理由感到惊讶。你能更新一下吗?
  • SQL Fiddle generally no longer works @AWright,它并不特定于这个答案。我无法加载内容,但重新阅读此答案将是一些示例数据和一个简单的数据透视语句。比任何新信息更多的是“自己尝试”。 OP已经提供了小例子的DDL和DML,所以自己运行应该很简单。
【解决方案2】:

也许对你有帮助:

select 'id', LISTAGG(id, ' ') WITHIN GROUP (ORDER BY name)      
from testtable
union 
select 'name', LISTAGG(name, ' ') WITHIN GROUP (ORDER BY name)
from testtable

编辑:

或使用枢轴:

create table TestTable2 (id varchar2(30), name varchar2(10));

insert into TestTable2 values ('id', 'name');


insert into TestTable2
select cast(id as varchar2(30)) as id , name
from testtable

  select *
    from testtable2
    pivot (  max(name)
             for id in ('id',1,2,3,4) 
)

【讨论】:

  • 嗨,谢谢。您的回复非常接近我的要求。但是输出应该在列中。不仅仅是列之间的空间。感谢您提供更多帮助。谢谢
【解决方案3】:

PIVOT 运算符就是您要找的。​​p>

【讨论】:

    猜你喜欢
    • 2021-02-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-23
    • 1970-01-01
    • 2011-05-31
    • 1970-01-01
    相关资源
    最近更新 更多