2015-05-20 7 views
0

У меня есть таблица EmpJob, в которой перечислены сотрудники, задание и количество раз, когда выполнялось задание (столбцы: EmpID, JobID, Total). У меня есть другая таблица поиска Jobs, в которой перечислены все задания (столбцы: JobID, JobDesc). Работник может не выполнять все задания. Мое требование состоит в том, чтобы показать всем сотрудникам, показывающим все Рабочие места с Count for Jobs, но не выполненными как ноль. Я не знаю об этом. Я пробовал использовать статью IF EXISTS или NOT EXISTS в статье WHERE, но это не дает мне правильных результатов. Вот пример: Jobs стол:SQL Вставить отсутствующие значения из таблицы поиска в таблицу транзакций

JobID | JobDesc 
--------------- 
1 | Job1 
2 | Job2 
3 | Job3 

EmpJob стол:

EmpID | JobID | Total 
Emp1 |  1 | 3 
Emp1 |  3 | 5 
Emp2 |  2 | 6 

Результат должен быть 3 Jobs x 2 Employees = 6 records в

Emp1 | Job1 | 3 
Emp1 | Job2 | 0 
Emp1 | Job3 | 5 
Emp2 | Job1 | 0 
Emp2 | Job2 | 6 
Emp2 | Job3 | 0 

Может кто-нибудь предложить запрос? Заранее спасибо.

ответ

0

Эскиз стратегии следовать:

  • получить набор сотрудников:

     
    select distinct EmpID from EmpJob // query1
    (если у вас нет другого источника работников)

  • получить кросс-продукт работы и сотрудников:

     
    select EmpID,JobID,0 as Total from <query1> outer join Jobs // query2 
    

  • сделать объединение известных графов и 0-подсчетов:

     
    select EmpID,JobID,Total from EmpJob union <query2> // query3 
    

  • подведем итоги каждого (сотрудников, работа) группа

     
    select EmpID,JobID,sum(Total) from <query3> group by EmpID,JobID 
    

Ввод куски вместе дает результат:

 
select EmpID, JobID, sum(Total) as Total from (
    (select EmpID, JobID, 0 as Total from Jobs outer join (select distinct EmpID from EmpJob)) 
    union 
    (select EmpID, JobID, Total from EmpJob) 
) group by EmpID, JobID 
order by EmpID, JobID 

+0

С LEFT OUTER JOIN на Джобсом вы получаете EmpId и JobId в NULLS для 0 Всего строк. – NP3