如何根据列值计算行null而不是null

时间:2014-10-19 09:11:48

标签: oracle group-by

可能这个问题与另一个问题重复,我已经在这里探讨了几个类似的问题,但我找不到类似的问题。如果您找到类似问题的链接,请建议。

我的问题是,我有一张表说CLIENTS如下

BRANCH     CLNTID      ACCNT      FACID
------ ---------- ---------- ----------
   201      10001     123400     110021

   201      10001     123401

   201      10001     123402     110023

   201      10001     123403

   201      10001     123404     110025

   201      10001     123405

   201      10001     123406     110027

   201      10001     123407     110028

等......很多行。 现在我想编写一个查询来提供这样的输出

Branch   clntid   facid_null   facid_not_null

 201       10001      3              5

我想为每个分支和每个clntid找到facid = null和facid!= null的facid colmun计数。

我写了下面的查询,但是它只提取一个facid为null或facid不为空。

select branch,clntid,count(*)
from clnt
where facid is null
group by branch, clntid;

请帮我在使用GROUP BY和OVER(PARTITION BY)子句的单个查询中查找两个计数。

提前致谢。 的Vivek。

2 个答案:

答案 0 :(得分:1)

select branch
      ,clntid
      ,count(*)                as num_rows
      ,count(facid)            as not_nulls
      ,count(*) - count(facid) as nulls
  from clnt
 group 
    by branch
      ,clntid;

答案 1 :(得分:0)

聚合函数COUNT计算所有非空出现次数,因此您可以简单地使用count(facid)来计算facid_not_null列,并且您可以使用类似的技术并首先交换null而不是null为facid_null列。这是一个有效的例子:

SQL> create table clnt (branch,clntid,accnt,facid)
  2  as
  3  select 201, 10001, 123400, 110021 from dual union all
  4  select 201, 10001, 123401, null from dual union all
  5  select 201, 10001, 123402, 110023 from dual union all
  6  select 201, 10001, 123403, null from dual union all
  7  select 201, 10001, 123404, 110025 from dual union all
  8  select 201, 10001, 123405, null from dual union all
  9  select 201, 10001, 123406, 110027 from dual union all
 10  select 201, 10001, 123407, 110028 from dual
 11  /

Table created.

SQL> select branch
  2       , clntid
  3       , count(case when facid is null then 1 end) facid_null
  4       , count(facid) facid_not_null
  5    from clnt
  6   group by branch
  7       , clntid
  8  /

    BRANCH     CLNTID FACID_NULL FACID_NOT_NULL
---------- ---------- ---------- --------------
       201      10001          3              5

1 row selected.