2015-03-28 5 views
0
Person table 
--------------------- 
|email (pk) | name| 
--------------------- 
|[email protected]| A | 
|[email protected]| B | 
|[email protected]| C | 

Role table 
--------------------------------- 
|Role    |Power  | 
-------------------------------| 
|Primary   |20  | 
|Secondary   |10  | 
|Supervisor   |30  | 
-------------------------------- 
Assignment table 
------------------------------------------------------------------ 
|Team Name| Term | Role  |Email   |Join_date 
------------------------------------------------------------------ 
|AA  |2013_1 |Supervisor |[email protected] |2013-08-05 
|BB  |2013_1 |Secondary |[email protected] |2013-08-05 
|CC  |2013_1 |Supervisor |[email protected] |2013-08-05 
|DD  |2013_1 |Secondary |[email protected] |2013-08-05 
|AA  |2013_1 |Secondary |[email protected] |2013-08-05 

Мой ожидаемый результатподсчета результата запроса

|name | email  | num_of_time_pri | num_of_time_sec | num_of_time_sup| 
--------------------------------------------------------------------------------------- 
|A | [email protected]|0    |2    | 1    | 
|B | [email protected]|0    |1    | 0    | 
|C | [email protected]|0    |0    | 1    | 

Учитывая термин, например 2013_1 я должен найти все лицо, которое назначено хотя бы одна роль. И подсчитайте, сколько из каждой роли назначено человеку.

Используя этот запрос:

select 
     distinct p.name, 
     p.email 
from assignment a,person p 
where term ='2013_1' and 
     a.email = p.email; 

предположить, что это возвращает 3 строки, как показано в таблице человек. И оттуда я хочу получить ожидаемую таблицу результатов. Как мне продолжить?

ответ

1

Используйте заявление агрегата case. И, насколько возможно, воздержитесь от использования implicit join.

select 
     p.name, 
     p.email, 
     sum(case when role='Primary' then 1 else 0 end) as num_of_time_pri, 
     sum(case when role='Secondary' then 1 else 0 end) as num_of_time_sec, 
     sum(case when role='Supervisor' then 1 else 0 end) as num_of_time_sup 
from assignment a 
inner join person p on a.email = p.email 
where term ='2013_1' 
group by p.name,p.email; 

ИЛИ

select 
     p.name, 
     p.email, 
     count(case when role='Primary' then 1 end) as num_of_time_pri, 
     count(case when role='Secondary' then 1 end) as num_of_time_sec, 
     count(case when role='Supervisor' then 1 end) as num_of_time_sup 
from assignment a 
inner join person p on a.email = p.email 
where term ='2013_1' 
group by p.name,p.email; 
+0

вы можете объяснить мне, как в 'дело when' работает? – root

+1

Просто, если строка имеет роль, которая является «Первичной», она вернет истинное условие, которое равно 1. Затем, используя сумму, она даст общее количество строк, для которых роль равна «Первичная». Итак, «Супервизор» и «Вторичный». – Rigel1121

+0

можно добиться того же результата с помощью 'count()'? я пробовал всевозможные способы. Одна из проблем заключалась в том, что когда человек C, который не был назначен как sec или pri, запрос исключил человека C целиком. – root

Смежные вопросы