2016-09-16 61 views
1

我試圖從多個表中選擇所有的唯一行,並且它們在表中相同的位置添加合計togther。按空值分組

這是工作正常,除非在兩個表中的列中有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查詢:

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 
1    A 
1    B 
2    B 
1    A 

Disired結果

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

我已經嘗試使用

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

只是爲了你自己的測試,爲了讓你的原始查詢工作,你需要修改完整的外部連接的連接條件,從'使用(col1,col2)'到'ON(NVL(t1.col1,'{NULL }')= NVL(t2.col1,'{NULL}')AND NVL(t1.col2,'{NULL}')= NVL(t2.col2,'{NULL}'))' – Boneist