我有一个表,该表的产品由标识码定义,该标识码以数字开头,并以字母{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
我该怎么做才能动态设置列标题?
答案 0 :(得分:0)
我根据威廉·罗伯逊的建议弄清楚了。我将数据后台处理到一个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 …
我不会说这是最优雅的解决方案,但是它绝对可以解决问题,并且减少了很多硬编码查询。