Сложный SQL-запрос - вложенный запрос
Вот таблица job_form...
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 в течение нескольких лет, и это полностью меня озадачило. Я знаю, что должен сделать вложенный запрос, но не могу обработать заказ...
Любая помощь высоко ценится.
Обновлено, чтобы включить имя столбца в результате (забыл об этом, извините)
2 ответа
Править Согласно Гордону, нет необходимости в объединении, если вам не требуется какой-либо из 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
Это простой запрос агрегации:
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
пункт.