2013-05-09 5 views
1

Вот таблица job_form ...комплекс SQL запросов - Вложенный запрос

job_num | name | address | 
---------+------+---------+ 
1  | Tom | Smith | 
2  | John | Doe  | 
3  | Max | Smith | 

Вот таблица individual_job ...

job_num | date  | description | 
---------+------+---------------------+ 
1  | 23-01-2012 | Eat food  | 
1  | 24-01-2012 | Do dishes  | 
1  | 25-01-2012 | Sweep floor | 
...  | ...  | ...   | 
2  | 19-05-2013 | Play games | 
2  | 23-05-2013 | Do code  | 
2  | 27-05-2013 | Sleep   | 
...  | ...  | ...   | 
3  | 23-05-2013 | Eat food  | 
3  | 24-05-2013 | Do dishes  | 
3  | 25-05-2013 | Sweep floor | 
...  | ...  | ...   | 

Я хотел бы создать запрос, который вытаскивает одна строка для каждой формы job_form, которая включает в себя дату завершения первого задания, дату завершения последнего задания, а также общее количество заданий, перечисленных в форме. В запросе должны отображаться только формы заданий, в которых есть задания, которые необходимо выполнить в будущем.

Пример является:

job_num | first_job_date | last_job_date | count_of_jobs | name 
---------+------------------+-----------------+-----------------+------------- 
2  | 19-05-2013  | 27-05-2013  | 3    | John 
3  | 23-05-2013  | 25-05-2013  | 3    | Max 

Я не сделал SQL в течение нескольких лет, и это один имеет меня полностью тупик. Я знаю, что мне нужно сделать вложенный запрос, но не могу выполнить заказ ...

Любая помощь очень ценится.

Обновлено включать имя столбца в результате (забыл об этом, извините)

ответ

0

Редактировать Как и в случае с Гордоном, нет необходимости в соединении, если вы не требуете каких-либо из job_form конкретных полей. Однако, если вы это сделаете (например, имя или адрес), то:

SELECT jf.job_id, 
     jf.name, 
     MIN(ij.date) AS first_job_date, 
     MAX(ij.date) as last_job_date, 
     COUNT(*) as count_of_jobs 
FROM job_form jf 
    INNER JOIN individual_job ij 
    ON jf.job_num = ij.job_num 
GROUP BY jf.job_id, jf.name -- i.e. non-aggregated select fields here 
3

Это простой агрегация запрос:

select ij.job_num, 
     min(ij.date) as first_job_date, 
     max(ij.date) as last_job_date, count(*) as count_of_jobs 
from individual_job ij 
group by ij.job_num 

Для будущих рабочих мест, вам нужно сравнение даты, что-то вроде следующего (в зависимости от базы данных):

where date >= sysdate 

или

where date >= now() 

или

where date >= getdate() 

Предложение where идет после пункта from.

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