可能这个问题与另一个问题重复,我已经在这里探讨了几个类似的问题,但我找不到类似的问题。如果您找到类似问题的链接,请建议。
我的问题是,我有一张表说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。
答案 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.