【发布时间】:2018-10-19 22:21:41
【问题描述】:
我有一个表,其中包含由标识代码定义的产品,该标识代码以数字开头并以字母结尾,例如 1A、3B、7C 等。查询组合了我需要的关于这些的数据带有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,我听取了您的建议,并找到了使其发挥作用的方法。我在下面的答案中详细说明了它。感谢您的帮助,不胜感激!