2013-09-18 2 views
0

У меня есть таблица вроде этого:
страны группироваться и сосчитать

------------------------------- 
EMP ID|Country |Emp Level | 
------|-----------|-----------| 
102 |UK   |Staff  | 
103 |US   |Admin Staff| 
104 |CA   |Staff  | 
105 |NL   |Admin Staff| 
106 |MN   |Intern  | 
107 |IN   |Staff  | 
108 |UK   |Staff  | 
109 |US   |Admin Staff| 
110 |IN   |Admin Staff| 
------------------------------ 

Мне нужно подсчитать количество сотрудников в каждой категории в каждой стране данного следующее условие: Если страна не в ('UK' or 'US' or 'CA') затем рассматривать его как 'Глобальный'. Итак, наш ответ должен быть:

------------------------------ 
|Country |Emp Level |Count| 
|-----------|-----------|----- 
|UK   |Staff  |2 
|US   |Admin Staff|2 
|CA   |Staff  |1 
|Global  |Admin Staff|2 
|Global  |Intern  |1 
|Global  |Staff  |1 

До сих пор я могу рассчитывать количество сотрудников в каждой категории, в каждой стране, но не может клуб страны не в данном наборе и сосчитать & отображать их как глобальные.

+0

Вы можете разместить схему с образцами данных ?. –

ответ

4
SELECT Country, EmpLevel, COUNT(*) AS Count 
FROM  my_table 
WHERE Country IN ('UK', 'US', 'CA') 
GROUP BY Country, EmpLevel 

UNION 

SELECT 'Global', EmpLevel, COUNT(*) AS Count 
FROM  my_table 
WHERE Country NOT IN ('UK', 'US', 'CA') 
GROUP BY EmpLevel 

Посмотри на sqlfiddle.

2

Вы пробовали это?

select country as cou, emp_level as emp, count(*) 
from your_table 
where country in ('UK', 'US', 'CA') 
group by cou, emp 
order by cou, emp 
union 
select 'global', emp_level as emp, count(*) 
from your_table 
where country not in ('UK', 'US', 'CA') 
group by emp 
order by emp 
2
SELECT 
    CASE WHEN Country IN ('UK', 'US', 'CA') THEN Country ELSE 'Global' END 
     AS Country, 
    EmpLevel, 
    COUNT(*) AS Count 
FROM 
    tableX 
GROUP BY 
    CASE WHEN Country IN ('UK', 'US', 'CA') THEN Country ELSE 'Global' END, 
    EmpLevel ; 

Там будет разница в результатах между этим запросом и один за @eggyal и @duffymo - если есть строки с NULL в колонке Country. Этот запрос будет считать эти строки в группах 'Global', другой запрос не будет считать их вообще.

+0

+1 Хороший вопрос о 'NULL' (хотя можно было бы просто добавить' OR Country IS NULL' в соответствующие критерии фильтра, если это необходимо); что я по-прежнему предпочитаю подход UNION, поскольку он может использовать индексы для фильтрации и группировки (тогда как я думаю, что ваша версия не может?). – eggyal

+0

@eggyal Я не уверен, будет ли мой запрос использовать индексы - или если он делает это эффективно. Ответ UNION с большей вероятностью сделает это. –

1

Может быть что-то, как это будет работать (непроверенные, и, возможно, потребуется немного больше работы)

SELECT CASE WHEN Country NOT IN ('US','UK','CA') THEN 'Global' ELSE Country, Emp_Level, COUNT(*) 
FROM table_name 
GROUP BY Country, Emp_Level 
Смежные вопросы