Представьте, что у меня есть CTE, который создает результирующий набор, содержащий всю необходимую мне информацию, и мне нужно выполнить несколько условных подсчетов для результирующего набора. Есть ли лучший способ сделать это, чем набор подзапросов?
Я также не могу использовать count() over ()
, так как мне иногда нужно сделать отдельный подсчет значений и использовать case when val=true then 1 else null end
для условного подсчета значений Позвольте мне четко подсчитать, не говоря уже о том, что это в основном то же самое, что делать несколько подзапросов.
Любые рекомендации или создание группы подзапросов на пути к go?
(пример 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
Пример вывода I будет надеяться на
TOTALROWS TOTAL45YO TOTALCHICAGO TOTALCITIES
------------------------------------------------------
5 2 3 3