如何在Oracle 11中将SQL列值用作列名

时间:2011-11-08 17:07:07

标签: sql oracle11g

我的表格如下:

    Date     |  Communication_Type
   ----------  --------------------
   12/10/2011  EMAIL
   12/10/2011  WEB
   12/10/2011  WEB
   11/10/2011  MAIL
   11/10/2011  FAX
   11/10/2011  FAX
   11/10/2011  EMAIL

我想编写一个查询来显示特定日期的前两种通信类型,但通信类型不限于此处显示的类型,它们可以是100种之一。

有没有办法让我得到这样的输出,即11/11/2011

<_top_communication_type_count> | <second_top_communication_type_count>
-------------------------------- --------------------------------------
2                                1    

其中_top_communication_type_count在此实例中为FAX_COUNT,但12/11/2011WEB_COUNT

它有点难以解释,但希望你明白我的意思! 我找到了mySQL的例子,但没有找到Oracle的例子。

1 个答案:

答案 0 :(得分:0)

在Oracle中使用未知值列表作为列名称是不可能的(10g确实有pivot,但它需要一个已知的值列表)。从理论上讲,你可以先查询唯一值,然后构建一个动态查询,但这对于略微有用的结果来说会有很多工作。

下面是一个以正常的行格式返回数据的解决方案(基于@Michael Durrant的答案,修改为在Oracle中工作):

select *
from   (
   select communication_type
   from   communications c
   where  date = 'the_date'
   order  by count(c.communication_type)
   group  by c.communication_type)
where rownum <= 2