sql запрос подсчитать нули - PullRequest
1 голос
/ 10 сентября 2010

У меня есть этот sql-запрос для получения идентификаторов из таблицы с 3 столбцами: ID, страна и возраст

SELECT Country, 
(CASE 
 WHEN AGE BETWEEN 0 AND 9 THEN '0-9'
 WHEN AGE BETWEEN 10 AND 19 THEN '10-19'
 WHEN AGE BETWEEN 20 AND 29 THEN '20-29'
 WHEN AGE BETWEEN 30 AND 39 THEN '30-39'
 WHEN AGE BETWEEN 40 AND 49 THEN '40-49'
 ELSE '50+'
END) Age_Bins, COUNT (DISTINCT ID)
FROM MYTABLE
GROUP BY Country, Age_Bins;

Результаты, которые я получаю, примерно такие:

UK '0-9' 7; 
UK '20-29' 14; 
etc... 

Но то, что я хотел бы также иметь, это Великобритания '10 -19 '0 (где в этом возрасте нет идентификаторов). Как SQL-код может быть изменен соответствующим образом, чтобы также дать результаты с нулевым счетом. Спасибо

Ответы [ 2 ]

8 голосов
/ 10 сентября 2010

В идеале вы хотите, чтобы таблица «возрастных корзин» и таблица стран использовались следующим образом:

select c.Country, b.age_bin, count(distinct m.id)
from countries c
cross join age_bins b
left outer join mytable m on m.country = c.country
                          and m.age between b.min_age and b.max_age

При необходимости вы можете подделать таблицы следующим образом:

WITH countries as (select distinct country from mytable),
     age_bins as (select '0-9' age_bin, 0 min_age, 9 max_age from dual
                  union all
                  select '10-19' age_bin, 10 min_age, 19 max_age from dual
                  union all
                  ...
                 ),
select c.Country, b.age_bin, count(distinct m.id)
from countries c
cross join age_bins b
left outer join mytable m on m.country = c.country
                          and m.age between b.min_age and b.max_age
4 голосов
/ 10 сентября 2010

Вы можете создать каждую ячейку возраста как столбец с учетом регистра, возвращая либо 0, либо 1, и использовать SUM () вместо COUNT ()

 select V.country, sum(V.Zero2Nine) as [0-9], sum(V.Ten2Nineteen) as [10-19] ...
 from
 (
  select country,
   (case when age between 0 and 9 then 1 else 0 end) as Zero2Nine,
   (case when age between 10 and 19 then 1 else 0 end) as Ten2Nineteen
   from ...
  )  as V

 group by  V.country 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...