2010-10-04 49 views
1
SELECT a,b,count(*) 
FROM t 
GROUP BY rollup(a,b) 

结果:的Oracle SQL组数

a1, b1, 10 
a1, b2, 90 
a1, , 100 

我需要:

a1, b1, 10, 100 
a1, b2, 90, 100 

怎么样?

回答

4

此表模拟您的情况:

SQL> create table t (a,b) 
    2 as 
    3 select 'a1', 'b1' 
    4  from dual 
    5 connect by level <= 10 
    6 union all 
    7 select 'a1', 'b2' 
    8  from dual 
    9 connect by level <= 90 
10/

Table created. 

你只用三行结果错过了总计,所以这是一个有点不准确的:汇总(A,B)结果分3组4组。

SQL> select a 
    2  , b 
    3  , count(*) 
    4 from t 
    5 group by rollup(a,b) 
    6/

A B COUNT(*) 
-- -- ---------- 
a1 b1   10 
a1 b2   90 
a1   100 
      100 

4 rows selected. 

由一个常规组,在上面的解析函数,你可以实现你想要的结果集:

SQL> select a 
    2  , b 
    3  , count(*) 
    4  , sum(count(*)) over (partition by a) 
    5 from t 
    6 group by a 
    7  , b 
    8/

A B COUNT(*) SUM(COUNT(*))OVER(PARTITIONBYA) 
-- -- ---------- ------------------------------- 
a1 b2   90        100 
a1 b1   10        100 

2 rows selected. 

问候, 罗布。

+0

太棒了!谢谢! – mitsky 2010-10-05 08:21:58

1

用途:

SELECT t.a, 
     t.b, 
     COUNT(*), 
     (SELECT COUNT(*) 
      FROM YOUR_TABLE 
     GROUP BY t.a) 
    FROM YOUR_TABLE t 
GROUP BY t.a, t.b 
+0

这会访问YOUR_TABLE两次,这不是必需的。 – 2010-10-04 16:35:23

+0

@Rob van Wijk:我同意它访问表格两次,但如果分析不受支持(前8i) – 2010-10-04 17:13:42