2016-08-18 10 views
2

現在、次のコードを使用してテーブルをピボットしていますが、完全に機能しています。今度は、「No Data」でヌル値を置き換えた後、合計した後にエラーが発生するので、case文を間違った場所に配置していると思います。Oracle PivotテーブルのNull置換

これは動作します:

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

数字以外の列には「データなし」を表示してもよろしいですか?さらなる処理のために出力を使用する場合、これは苦痛になります。あなたがSQLでそれを行うことができる間にあなたが必要とするものがすべて報告されていれば、これはあなたの報告システム/ソフトウェア/アプリケーションによって最もうまくいく仕事です。 – mathguy

+0

それは良い点ですが、そうです、これは最終的な出力であり、それ以上の処理は行われません。これは外向きのレポートのため、No Data文字列が空白文字よりもよく見えるようにします。 – Darw1n34

+0

あなたの報告システムではNULLを「データなし」に置き換えることができます。クエリの結果に文字列が含まれていると、インターフェイスでは、(通常のように)右ではなく左に列が配置される可能性が高くなります。 – mathguy

答えて

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: expect aggregate function inside pivot operation

サンプル・スキーマ

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; 
+0

ORA-00904: "CASES": "PROV_NO、DATA_YEAR、DATA_MONTH、MEASURE_ID、CASES "行の無効な識別子 – Darw1n34

+0

明らかに、選択リストから 'CASES'を削除できますか?その列は絶対必要ですか? –

+0

それを削除する場合は、Pivo​​tステートメントでも同じエラーが発生します。その好きではないケース。それは私が要約するものなので、その必要があります。私はちょうどそれを離れて打ち続けるだろう。ありがとう。 – Darw1n34

0

みんなありがとう、あなたのすべての助けを借りて、私は一緒にこれをCOBすることができましたし、それが動作します。

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;