【问题标题】:how to count rows based on column values null and not null如何根据列值 null 而不是 null 计算行数
【发布时间】:2014-10-19 17:41:09
【问题描述】:

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

我的问题是,我有一张表说 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 不为 null。

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

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

提前致谢。 维维克。

【问题讨论】:

    标签: oracle group-by


    【解决方案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 让我记住 count 只计算非空值
    【解决方案2】:

    聚合函数COUNT 计算所有非空出现次数,因此您可以简单地使用 count(facid) 对 facid_not_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.
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-02-08
      • 2015-09-30
      • 2015-09-23
      • 2014-10-29
      • 2011-12-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多