【问题标题】:How to Dynamically Format Column Headers with Substitution Variables如何使用替换变量动态格式化列标题
【发布时间】:2018-10-19 22:21:41
【问题描述】:

我有一个表,其中包含由标识代码定义的产品,该标识代码以数字开头并以字母结尾,例如 1A3B7C 等。查询组合了我需要的关于这些的数据带有PIVOT 声明。不幸的是,在 Oracle 中,我们不允许以数字开头的别名。到目前为止,我已经通过输出基本上如下的数据成功地解决了这个问题:

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   

如何动态设置列标题?

【问题讨论】:

  • SQL*Plus 不能递归地将变量扩展为 SQL*Plus 命令并执行它们。你需要执行一个有效的命令,即使它包含变量并且你动态地调用它。
  • 我该怎么做呢?
  • 您必须将命令 spool 到一个临时脚本文件并执行它,可能使用 set termout off feedback off heading off 等来抑制不需要的输出。它变得一团糟。
  • 这是个好主意,我会在星期一回到办公室时尝试一下,然后告诉你进展如何。不幸的是,整个事情有点混乱,这就是为什么我试图制作一个脚本来处理一次,而不是随着事情的变化一遍又一遍地硬编码。
  • @WilliamRobertson,我听取了您的建议,并找到了使其发挥作用的方法。我在下面的答案中详细说明了它。感谢您的帮助,不胜感激!

标签: sql oracle sqlplus


【解决方案1】:

我是根据威廉·罗伯逊的建议弄清楚的。我将数据假脱机到一个 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 …

我不会称其为最优雅的解决方案,但它确实成功了,并且减少了很多硬编码查询。

【讨论】:

    猜你喜欢
    • 2021-06-30
    • 1970-01-01
    • 2015-10-01
    • 1970-01-01
    • 2016-10-18
    • 1970-01-01
    • 2019-11-16
    • 2012-10-17
    • 1970-01-01
    相关资源
    最近更新 更多