我目前正在使用以下代码来旋转表格,它完美无缺。现在我想用' No Data'替换任何空值。在总结之后但我得到错误,所以我认为我将案例陈述放在错误的地方。
这有效:
SELECT *
FROM (SELECT PROV_NO, DATA_YEAR, DATA_MONTH, MEASURE_ID, CASES
FROM pivot_test_2)
PIVOT (SUM(CASES) FOR (MEASURE_ID) IN ('MORT_30_AMI', 'MORT_30_HF', 'MORT_30_PN'))
order by PROV_NO, DATA_YEAR, DATA_MONTH;
但这不是
SELECT *
FROM (SELECT PROV_NO, DATA_YEAR, DATA_MONTH, MEASURE_ID, CASES
FROM pivot_test_2)
PIVOT (SUM(CASES) FOR (MEASURE_ID) IN ('MORT_30_AMI', 'MORT_30_HF', 'MORT_30_PN'))
case when MORT_30_HF is null then 'No Data' else MORT_30_HF end
order by PROV_NO, DATA_YEAR, DATA_MONTH;
我得到" ORA-00933:SQL命令未正确结束"作为错误。我试图放置";"周围,但错误仍然是相同的。我目前在Oracle 11g中使用Golden作为我的脚本/检索软件。
答案 0 :(得分:3)
您可以将CASE语句移动到SELECT语句并在那里处理NULL值。更好的是,使用COALESCE。但不幸的是,您必须为SELECT列表中的每个项目执行此操作:
SELECT
--Must manually reference each column.
COALESCE(TO_CHAR(MORT_30_AMI), 'No Data') MORT_30_AMI,
COALESCE(TO_CHAR(MORT_30_HF), 'No Data') MORT_30_HF,
COALESCE(TO_CHAR(MORT_30_PN), 'No Data') MORT_30_PN,
PROV_NO, DATA_YEAR, DATA_MONTH
FROM (SELECT PROV_NO, DATA_YEAR, DATA_MONTH, MEASURE_ID, CASES
FROM pivot_test_2)
PIVOT
(
SUM(CASES)
FOR (MEASURE_ID) IN
--Use aliases to make the columns easier to use.
('MORT_30_AMI' MORT_30_AMI, 'MORT_30_HF' MORT_30_HF, 'MORT_30_PN' MORT_30_PN))
ORDER BY PROV_NO, DATA_YEAR, DATA_MONTH;
一个不起作用的简单版本
理想情况下,您可以替换此部分代码:
SUM(CASES)
有了这个:
COALESCE(TO_CHAR(SUM(CASES)), 'No data')
然后你不需要单独处理每一列。但似乎没有一种方法可以自动将非聚合函数应用于PIVOT的结果。使用上面的代码生成此错误消息:
ORA-56902:期望在枢轴操作中的聚合函数
示例架构
create table pivot_test_2
(
PROV_NO CHAR(6),
DATA_YEAR NUMBER(4),
DATA_MONTH Number(2),
MEASURE_ID VARCHAR2(250),
CASES NUMBER
);
insert into pivot_test_2
select 'A', 2000, 1, 'MORT_30_AMI', 1 from dual union all
select 'A', 2000, 1, 'MORT_30_AMI', 1 from dual union all
select 'A', 2000, 1, 'MORT_30_HF', 2 from dual union all
select 'A', 2000, 1, 'MORT_30_HF', 2 from dual;
答案 1 :(得分:0)
感谢大家,在大家的帮助下,我能够将这一切结合在一起并且有效。
SELECT PROV_NO, DATA_YEAR, DATA_MONTH,
case when MORT_30_AMI is null then 'No Data' else to_char(MORT_30_AMI) end as MORT_30_AMI,
case when MORT_30_HF is null then 'No Data' else to_char(MORT_30_HF) end as MORT_30_HF,
case when MORT_30_PN is null then 'No Data' else to_char(MORT_30_PN) end as MORT_30_PN
FROM pivot_test_2
PIVOT (SUM(CASES) FOR (MEASURE_ID) IN ('MORT_30_AMI' as MORT_30_AMI,'MORT_30_HF' as MORT_30_HF, 'MORT_30_PN' as MORT_30_PN))
order by PROV_NO, DATA_YEAR, DATA_MONTH;
答案 2 :(得分:0)
将DECODE关键字用于查询定义的字段(来自透视定义字段列表),然后将NULL替换为您需要的任何值。即,而不是NULL将其替换为“无数据”。我认为应该解决这个问题。