如何使用替换变量动态格式化列 Headers
How to Dynamically Format Column Headers with Substitution Variables
我有一个 table,其产品由以数字开头并以字母结尾的识别代码定义,例如 1A
、3B
、7C
等。查询使用 PIVOT
语句收集我需要的关于这些的数据。不幸的是,在 Oracle 中我们不允许以数字开头的别名。到目前为止,我已经通过输出基本上如下的数据成功地解决了这个问题:
SELECT * FROM MyTable
PIVOT ( COUNT(Product) FOR ProductName IN (&product_statement) )
其中替换变量 product_statement
是在此处描述的相同过程的帮助下动态生成的:。这是一个有代表性的结果:
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
我需要做什么才能动态设置列 headers?
我是根据 William Robertson 的建议想出来的。我将数据假脱机到一个 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 …
我不会称它为最优雅的解决方案,但它确实起到了作用,减少了大量硬编码查询。
我有一个 table,其产品由以数字开头并以字母结尾的识别代码定义,例如 1A
、3B
、7C
等。查询使用 PIVOT
语句收集我需要的关于这些的数据。不幸的是,在 Oracle 中我们不允许以数字开头的别名。到目前为止,我已经通过输出基本上如下的数据成功地解决了这个问题:
SELECT * FROM MyTable
PIVOT ( COUNT(Product) FOR ProductName IN (&product_statement) )
其中替换变量 product_statement
是在此处描述的相同过程的帮助下动态生成的:
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
我需要做什么才能动态设置列 headers?
我是根据 William Robertson 的建议想出来的。我将数据假脱机到一个 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 …
我不会称它为最优雅的解决方案,但它确实起到了作用,减少了大量硬编码查询。