【问题标题】:A Better Way for Conditional Counting?条件计数的更好方法?
【发布时间】:2020-01-22 14:37:17
【问题描述】:

想象一下,我有一个 CTE,它创建了一个结果集,其中包含我需要的所有信息,并且需要对结果集进行大量条件计数。有没有比一堆子查询更好的方法?

我也不能使用count() over (),因为我有时需要对值进行不同的计数,并且使用case when val=true then 1 else null end 有条件地计数并不能让我清楚地计数,更不用说它基本上与做一堆子查询。

有什么建议,还是要创建一堆子查询?

(example SQL Fiddle)

表定义

create table person (id int, name varchar2(20), age int, cityID int);
create table city (id int, name varchar2(20), stateID int);
create table state (id int, name varchar2(20));

insert into person values(1, 'Bob', 45, 1);
insert into person values(2, 'Joe', 33, 1);
insert into person values(3, 'Craig', 20, 1);
insert into person values(4, 'Alex', 45, 2);
insert into person values(5, 'Kevin', 33, 3);

insert into city values(1, 'Chicago', 1);
insert into city values(2, 'New York', 2);
insert into city values(3, 'Los Angeles', 3);

insert into state values(1, 'Illinois');
insert into state values(2, 'New York');
insert into state values(3, 'California');

SQL 查询示例

with cte as (
  select p.name pName
    , p.age pAge
    , c.name cName
    , s.name sName
  from person p
  inner join city c
    on p.cityID = c.ID
  inner join state s
    on c.stateID = s.ID
)
select distinct
    (select count(*) from cte) totalRows
  , (select count(*) from cte where pAge = 45) total45YO
  , (select count(*) from cte where cName like 'Chicago') totalChicago
  , (select count(distinct cName) from cte) totalCities
 from cte

我希望的示例输出

 TOTALROWS  TOTAL45YO   TOTALCHICAGO    TOTALCITIES
------------------------------------------------------
     5         2             3               3

【问题讨论】:

  • select ... , sum(case when cName = 'Chicago' then 1 else 0 end) as totalChicago, ...

标签: sql oracle count oracle12c


【解决方案1】:

正如@jarlh 提到的那样,最简单的方法是使用案例/总和组合来完成如下。

SQL> select count(*) totalRows
  2    , sum(case when p.age=45 then 1 else 0 end) total45YO
  3    , sum(case when c.name like 'Chicago' then 1 else 0 end) totalChicago
  4    , count(distinct c.name) totalCities
  5  from person p
  6  inner join city c
  7    on p.cityID = c.ID
  8  inner join state s
  9    on c.stateID = s.ID;
TOTALROWS    TOTAL45YO    TOTALCHICAGO    TOTALCITIES
____________ ____________ _______________ ______________
           5            2               3              3


SQL>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-29
    相关资源
    最近更新 更多