Oracle数据透视表

时间:2016-08-18 16:15:25

标签: oracle pivot case-when

我目前正在使用以下代码来旋转表格,它完美无缺。现在我想用' 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作为我的脚本/检索软件。

3 个答案:

答案 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将其替换为“无数据”。我认为应该解决这个问题。