MySQL вызов с использованием MIN и подзапроса

0

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

Что я получаю для min_date_over_all_years

orgA    2017-10-09
orgB    2017-10-08

Требуемый результат для min_date_over_all_years

orgA        2015-10-10 
orgB        2014-10-09

Пожалуйста, см. Прилагаемую скрипку для примера: http://sqlfiddle.com/#!9/c0f74/9

Схема:

CREATE TABLE IF NOT EXISTS 'project' (
  'project_id' int(11) NOT NULL AUTO_INCREMENT,
  'p_name' varchar(10) NOT NULL,
  'start_date' DATE NOT NULL,
  'organisation_id' int(11) NOT NULL,
  PRIMARY KEY ('project_id')
  ) ENGINE=InnoDB  DEFAULT CHARSET=latin1 AUTO_INCREMENT=6 ;

INSERT INTO 'project' ('project_id', 'p_name', 
'start_date', 'organisation_id')
VALUES
(1, 'testP1', '2017-10-09', 1),
(2, 'testP2', '2016-10-10', 1),
(3, 'testP3', '2015-10-10', 1),
(4, 'testP4', '2017-10-10', 2),
(5, 'testP5', '2014-10-10', 2),
(6, 'testP6', '2017-10-10', 1),
(7, 'testP7', '2016-10-10', 1),
(8, 'testP8', '2015-10-10', 1),
(9, 'testP9', '2017-10-08', 2),
(10, 'testP10', '2014-10-09', 2);

CREATE TABLE IF NOT EXISTS 'organisation' ('organisation_id' int(11) NOT NULL AUTO_INCREMENT,
'org_name' varchar(10) NOT NULL, 
 PRIMARY KEY ('organisation_id')
) ENGINE=InnoDB  DEFAULT CHARSET=latin1 AUTO_INCREMENT=6 ;

INSERT INTO 'organisation' ('organisation_id', 'org_name' 
)
 VALUES
(1, 'orgA'),
(2, 'orgB');

И запрос, который я попробовал (наряду с более простым подзапросом и версиями Case):

SELECT o.org_name, MIN(p.start_date) AS min_date_2017, YEAR(p.start_date) AS year_selected,
(SELECT MIN(p.start_date) FROM project p2
INNER JOIN organisation o2 ON o2.organisation_id = p2.organisation_id
 WHERE p2.organisation_id = o.organisation_id
GROUP BY o2.organisation_id) AS min_date_over_all_years
FROM organisation o
INNER JOIN project p on p.organisation_id = o.organisation_id
WHERE YEAR(p.start_date)=2017
GROUP BY o.organisation_id
Теги:
subquery

1 ответ

0
Лучший ответ

Вы не можете поместить подзапрос, который возвращает несколько строк в списке SELECT; когда подзапрос используется как выражение, он должен возвращать одну строку с одним столбцом.

Вам не нужен отдельный запрос.

SELECT o.org_name,
        MIN(IF(YEAR(p.start_date) = 2017, p.start_date, NULL)) AS min_date_2017,
        2017 AS year_selected,
        MIN(p.start_date) AS min_date_over_all_years
FROM organisation AS o
INNER JOIN project AS p ON p.organisation_id = o.organisation_id
GROUP BY o.organisation_id

Вы также можете присоединиться к подзапросу, который получает общие данные.

SELECT o.org_name, MIN(p.start_date) AS min_date_2017, YEAR(p.start_date) AS year_selected, overall.start_date AS min_date_over_all_years
FROM organisation o
INNER JOIN project p on p.organisation_id = o.organisation_id
INNER JOIN (
    SELECT organisation_id, MIN(start_date) AS start_date
    FROM project 
    GROUP BY organisation_id) AS overall ON o.organisation_id = overall.organisation_id
WHERE YEAR(p.start_date)=2017
GROUP BY o.organisation_id
  • 0
    Спасибо - но (я думаю) предложение WHERE в целом важно, так как я хочу вернуть другие сводные данные, например SUM (invoice_value), основанные на предложении "WHERE YEAR (p.start_date) = 2017". Было бы много полей на основе этот пункт и только тот, который основан на полном наборе данных?
  • 0
    Я добавил второе решение, которое объединяется с подзапросом, который получает общие данные.
Показать ещё 4 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню