代码之家  ›  专栏  ›  技术社区  ›  Zsolt Botykai

用Oracle转置Select结果

  •  2
  • Zsolt Botykai  · 技术社区  · 15 年前

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

    我必须根据表元数据(列格式)生成一些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?

    事先谢谢!

    2 回复  |  直到 15 年前
        1
  •  2
  •   Peter Lang    15 年前

    如果要为每个调用生成查询或使用硬编码的最大列计数,则可以执行以下操作:

    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
    

    看看汤姆·基特的 stragg .

        2
  •  1
  •   Donnie    15 年前

    你要找的关键字是 pivot . Here's 它的使用示例。语法通常与mssql相同,因为我不知道Oracle文档的URL,所以我将 MSDN 链接并希望比我更了解Oracle页面布局的人将对其进行编辑,以指向他们的文档。

    编辑: Oracle documentation ,搜索足够的数据透视时间,您将了解详细信息。