代码之家  ›  专栏  ›  技术社区  ›  SandPiper

如何使用替换变量动态格式化列标题

  •  0
  • SandPiper  · 技术社区  · 6 年前

    我有一个表,其中的产品由一个标识码定义,标识码以数字开头,以字母结尾,例如 1A , 3B 7C 查询用一个 PIVOT

    SELECT * FROM MyTable
    PIVOT ( COUNT(Product) FOR ProductName IN (&product_statement) )
    

    其中替换变量 product_statement How do I set LINESIZE and PAGESIZE with a substitution variable? . 这是一个具有代表性的结果:

    NAME     | A1 | B3 | C7
    Product A| 1  | 2  | 1   
    Product B| 3  | 1  | 2   
    

    &column_statement 看起来是这样的(每行之间用 CHR(10) ):

    COLUMN A1 TEMP FORMAT A3 HEADING ‘1A’
    COLUMN B3 TEMP FORMAT A3 HEADING ‘3B’
    COLUMN C7 TEMP FORMAT A3 HEADING ‘7C’
    

    我的想法是,我可以在SQL*Plus中执行以下操作:

    &column_statement
    
    SELECT * FROM MyTable
    PIVOT ( COUNT(Product) FOR ProductName IN (&product_statement) )
    /
    

    但它给了我以下信息:

    SP2-0734: unknown command beginning “&column_st…” – rest of line ignored.
    
    NAME     | A1 | B3 | C7
    Product A| 1  | 2  | 1   
    Product B| 3  | 1  | 2   
    

    如何动态设置列标题?

    1 回复  |  直到 5 年前
        1
  •  0
  •   SandPiper    5 年前

    我是根据威廉·罗伯逊的建议想出来的。我将数据假脱机到一个SQL文件中,然后运行刚才在脚本中创建的文件。流程如下:

    SET HEADING OFF
    SET PAGESIZE 0
    SPOOL /file_location/column_headers.sql
    
    -- SELECT statement to dynamically make the column header string. Example output:
    -- COLUMN A1 TEMP FORMAT A3 HEADING ‘1A’
    -- COLUMN B3 TEMP FORMAT A3 HEADING ‘3B’
    -- COLUMN C7 TEMP FORMAT A3 HEADING ‘7C’
    
    SPOOL OFF
    
    SET HEADING ON
    SET PAGESIZE 100
    SET TERMOUT ON
    
    @/file_location/column_headers.sql
    
    -- Now run the other query that uses these headers
    SELECT …