2016-09-16 62 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