计算列表中每个元素的并发数

时间:2012-11-20 12:52:28

标签: sql oracle count

我有一个条目列表,如果它们位于表的列中,我需要知道它。这很容易,但我不知道如何在DB列中没有出现此列表的条目时进行标记。 如果可能知道每个元素的Db列中的结果计数。如果列表中的元素未出现在DB列中,则输出必须为0.

当我说出一个列表时,它就是:

select xxxxxx from TABLE WHERE field in (a, b, c, d, ... , z);

2 个答案:

答案 0 :(得分:2)

为了做到这一点,您首先需要一种方法来了解要计算的值列表。您必须以某种方式自己生成它并将它们存储在某些描述的子查询中,或者使用此信息创建表或视图。

然后,您可以加入主表并计算出数字。

使用下表作为示例:

create table tmp_test ( numbers number, letters varchar2(1));

,其数据填充如下:

 insert into tmp_test
 select mod(level, 500), chr(mod(level,13) + 97) 
   from dual
connect by level <= 1000

如果我们假设您所追求的数值是95到105之间的数字,那么您的查询将是:

select all_vals, count(b.numbers)
  from ( select level + 94 as all_vals
           from dual
        connect by level <= 11
                ) a
  left outer join tmp_test b
    on a.all_vals = b.numbers
 group by a.all_vals
 order by all_vals
       ;

  ALL_VALS COUNT(B.NUMBERS)
---------- ----------------
        95               10
        96               10
        97               10
        98               10
        99               10
       100                0
       101                0
       102                0
       103                0
       104                0
       105                0

11 rows selected.

但是,如果您想要计算letters列中almp中的值数如果如下:

select all_vals, count(b.letters)
  from ( select 'a' as all_vals from dual
          union all
         select 'l' from dual
          union all
         select 'm' from dual
          union all
         select 'p' from dual
                ) a
  left outer join tmp_test b
    on a.all_vals = b.letters
 group by a.all_vals
 order by all_vals
       ;

A COUNT(B.LETTERS)
- ----------------
a               76
l               77
m               77
p                0

如上所述,子查询很容易替代视图或表格。

LEFT OUTER JOIN就是这里的不同之处。您已生成要生成的值的生成列表,然后检查它们是否存在于您感兴趣的列中。

这是一个有效的SQL Fiddle这些例子。

答案 1 :(得分:2)

使用(全局)临时表或嵌套表对象。

  • 临时表(SQLFiddle demo

    CREATE GLOBAL TEMPORARY TABLE tmp (field NUMBER);
    
    INSERT INTO tmp (...);
    
    SELECT tmp.field, COUNT(t.field)
      FROM table t
     RIGHT JOIN tmp ON t.field = tmp.field
     GROUP BY tmp.field;
    
  • 表对象(demo

    CREATE OR REPLACE TYPE tab AS TABLE OF NUMBER;
    /
    
    SELECT tmp.column_value field, COUNT(t.field)
      FROM table t
     RIGHT JOIN TABLE(tab(a,b,c,d,e)) tmp ON t.field = tmp.column_value
     GROUP BY tmp.column_value;