2016-09-16 7 views
1

複数のテーブルからすべての一意の行を選択しようとしていますが、テーブル全体で同じである場合は合計をtogtherに追加します。NULL値でグループ化する

2つのテーブルの列にNULL値がある場合を除いて、これは問題なく動作しています。個々のテーブルではグループ化されていますが、次の表では結合されていません。

CREATE TABLE t1(col1 VARCHAR2 (1),col2 VARCHAR2 (1)); 

INSERT INTO t1 VALUES ('A', 'A'); 
INSERT INTO t1 VALUES ('A', 'B'); 
INSERT INTO t1 VALUES (NULL, 'A'); 
INSERT INTO t1 VALUES (NULL, 'B'); 
CREATE TABLE t2 AS SELECT * FROM t1; 
INSERT INTO t1 VALUES (NULL, 'B'); 

選択クエリ:

SELECT NVL (count_1, 0) + NVL (count_2, 0) AS TOTAL, col1, col2 
    FROM ( SELECT col1, col2, COUNT (1) count_1 
      FROM t1 
     GROUP BY col1, col2) t1 
     FULL OUTER JOIN ( SELECT col1, col2, COUNT (1) count_2 
          FROM t2 
         GROUP BY col1, col2) t2 
      USING (col1, col2) 

結果:私が使用して試してみました

TOTAL COL1 COL2 
2  A  A 
2  A  B 
2    A 
3    B 

TOTAL COL1 COL2 
2  A  A 
2  A  B 
1    A 
1    B 
2    B 
1    A 

Disired結果

nvl(col1,'N'), nvl(col2,'N') 

しかし、これにより構文エラーが発生するため、何とか正しく使用していません。

CASE WHEN col1 IS NULL THEN 'N' ELSE 'Y' END 

はそれを悪化させる:

1 A A 
1 A B 
1  A 
2  B 
1 A Y 
1 A Y 
1  N 
1  N 

どのように私は望ましい結果を達成することができますか?

答えて

2

これを試してみてください:

これは私が結果の面で何をしたいように見える
select count(*),col1,col2 from 
(
select col1,col2 from t1 
union all 
select col1,col2 from t2 
) 
group by col1,col2; 
+0

は(私はそれがこの方法で行われなければならなかった理由があるかもしれないとパフォーマンスにそれをテストする必要があります)。私は、最も簡単なオプションが常に最高だと思います! –

+0

独自のテストのために、元のクエリが機能するようにするには、完全な外部結合の結合条件を 'using(col1、col2)'から 'ON(NVL(t1.col1) '{NULL {NULL} ')= NVL(t2.col2、' {NULL} ')) 'NVL(t2.col1、' {NULL} ') – Boneist

関連する問題