【问题标题】:Transpose select results with Oracle使用 Oracle 转置选择结果
【发布时间】:2009-11-24 05:33:13
【问题描述】:

我的问题是,有一些背景:

我必须根据表元数据(列格式)生成一些sql查询,结果是这样的:

TABLENAME1|COL1
TABLENAME1|COL2
TABLENAME2|COL1
TABLENAME2|COL2
TABLENAME2|COL3
TABLENAME3|COL1
TABLENAME4|COL1
TABLENAME4|COL2
... /*some other 1800 rows */

(是的,它已订购。) 我需要的是根据第一列转置这些数据,所以预期的输出是:

TABLENAME1|COL1|COL2|NULL
TABLENAME2|COL1|COL2|COL3
TABLENAME3|COL1|NULL|NULL
TABLENAME4|COL1|COL2|NULL
/* less then 1800 rows ;-) */

是否可以使用 Oracle SQL?

提前致谢!

【问题讨论】:

    标签: sql oracle null transpose


    【解决方案1】:

    如果您想为每个调用生成查询或使用硬编码的 max-column-count,那么您可以执行以下操作:

    WITH tab AS
    (
      SELECT table_name, column_name FROM user_tab_cols WHERE column_id <= 4
    ) -- user_tab_cols used to provide test data, use your table instead
    SELECT MAX(c1) c1,
           MAX(c2) c2,
           MAX(c3) c3,
           MAX(c4) c4
      FROM (SELECT table_name,
                   DECODE( column_id, 1, column_name ) c1,
                   DECODE( column_id, 2, column_name ) c2,
                   DECODE( column_id, 3, column_name ) c3,
                   DECODE( column_id, 4, column_name ) c4
              FROM ( SELECT table_name,
                            column_name,
                            ROW_NUMBER() OVER ( PARTITION BY table_name ORDER BY column_name ) column_id
                       FROM tab
                   )
           )
     GROUP BY table_name
     ORDER BY table_name
    

    如果以那种形式获得它就足够了

    TABLENAME1|COL1,COL2
    TABLENAME2|COL1,COL2,COL3
    

    看看 Tom Kyte 的stragg

    【讨论】:

    • Tom Kyte 的 stragg 帮了大忙。
    【解决方案2】:

    您要查找的关键字是pivotHere's 使用示例。语法看起来通常与 MSSQL 相同,由于我不知道 Oracle 文档的 url,我将折腾 MSDN 链接并希望比我更了解 Oracle 页面布局的人会编辑它以指向他们的文档。

    编辑:Oracle documentation,搜索枢轴足够的次数,你会得到详细信息。

    【讨论】:

    • Pivot 是 SQL 中最酷的新增功能之一。想要在不硬编码列或编写讨厌的游标的情况下对查询结果进行非规范化?转身!
    • 但是当我现在不知道结果表中会出现多少列时它是否有效?
    • 除了在运行之前在前端动态生成 SQL 之外,在 SQL 中没有办法动态生成列数。如果您知道结果集中可能出现的最大列数,那么只要您不介意一堆空值,它应该可以正常工作。
    • 谢谢,我正在调查它,或者我将导出结果,并创建一个 AWK 包装器,以生成我的查询。
    • Oracle 文档在 select 语句的描述中提到了枢轴运算符。从那里有指向数据仓库指南的链接。 download.oracle.com/docs/cd/B28359_01/server.111/b28286/…
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-07
    • 2018-08-20
    • 2015-01-30
    相关资源
    最近更新 更多