Сложный 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 пункт.

Другие вопросы по тегам