Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / MySQL [игнор отключен] [закрыт для гостей] / запрос на выборку с разделением на года / 7 сообщений из 7, страница 1 из 1
20.03.2014, 21:03:13
    #38592357
marwell
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
запрос на выборку с разделением на года
доброго времени суток,
есть таблица с полями: id, id_student, date, flag_trud.
date - дата, flag_trud - 0 или 1.
Код: sql
1.
2.
3.
4.
5.
6.
7.
CREATE TABLE IF NOT EXISTS `132` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `id_student` int(11) NOT NULL,
  `date` date NOT NULL,
  `flag_trud` int(11) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB  DEFAULT CHARSET=cp1251 AUTO_INCREMENT=9 ;


содержит такие данные
Код: sql
1.
2.
3.
4.
5.
6.
7.
INSERT INTO `132` (`id`, `id_student`, `date`, `flag_trud`) VALUES
(1, 2, '2011-12-15', 0),
(2, 3, '2012-12-15', 1),
(3, 3, '2014-12-15', 1),
(4, 4, '2013-02-15', 1),
(5, 4, '2013-12-15', 0),
(6, 4, '2013-12-15', 1);


Пользователь задает два числа: начальный год и конечный год. Можно ли составить такой запрос, который бы вернул кол-во записей за каждый год с начального по конечный, у которых flag_trud=1, сгруппировав по id_student за каждый год?
Т.е например начальный год = 2011, конечный = 2014. В итоге по нашей таблице, в ответ должен получить нечто такое:
countyear02011120121201312014
пока могу придумать только так:
Код: sql
1.
select count(*) from history where date(date) between '2011' and '2014' and flag_trud='1' group by id_student


но это вернет только общее кол-во записей за этот промежуток с flag_trud=1 и сгруппировав по id_student. А мне нужно совсем не то...
...
Рейтинг: 0 / 0
20.03.2014, 21:20:25
    #38592367
marwell
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
запрос на выборку с разделением на года
хотя, вот так вроде почти то что надо получается
Код: sql
1.
select count(*), year(date) from history where year(date) between '2011' and '2015' and flag_trud='1' group by id_student, year(date)


только вот как быть с нулевым кол-вом за какой нибудь год...
...
Рейтинг: 0 / 0
21.03.2014, 05:19:50
    #38592499
tanglir
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
запрос на выборку с разделением на года
marwellтолько вот как быть с нулевым кол-вом за какой нибудь год...
Код: sql
1.
2.
3.
4.
5.
6.
select years.dt, sum(history.id is not null)
from years
left join history on history.date>=years.dt and history.date<date_add(years.dt,interval 1 year)
 and history.flag_trud='1' -- да, это должно быть тут; почему, подумайте сами
where years.dt between 2011 and 2015 
group by years.dt

в таблицу years надо заранее (однажды и навсегда) забить все года в виде дат NNNN-01-01.
...
Рейтинг: 0 / 0
21.03.2014, 18:50:30
    #38593235
Cygapb-007
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
запрос на выборку с разделением на года
tanglirв таблицу years надо заранее (однажды и навсегда) забить все года в виде дат NNNN-01-01.
В принципе, достаточно индексированной таблицы натуральных чисел, штук так до 10000 - на все случаи сойдет, и для дней года, и для перечня лет, да и для других запросов может вдруг неожиданно пригодиться :)
А один cross join - и есть 10^8 записей для стресс-теста
...
Рейтинг: 0 / 0
21.03.2014, 21:54:21
    #38593361
marwell
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
запрос на выборку с разделением на года
tanglir,

спасибо большое!
...
Рейтинг: 0 / 0
22.03.2014, 09:51:39
    #38593495
tanglir
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
запрос на выборку с разделением на года
Cygapb-007tanglirв таблицу years надо заранее (однажды и навсегда) забить все года в виде дат NNNN-01-01.
В принципе, достаточно индексированной таблицы натуральных чисел, штук так до 10000 - на все случаи сойдет, и для дней года, и для перечня лет, да и для других запросов может вдруг неожиданно пригодиться :)
А один cross join - и есть 10^8 записей для стресс-тестаМожно вообще сделать таблицу всех дат на +/- N лет от текущего момента с признаками начала/конца года/месяца. Этим можно сократить текст запросов за счёт неиспользования date_add :)
...
Рейтинг: 0 / 0
22.03.2014, 09:52:07
    #38593496
tanglir
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
запрос на выборку с разделением на года
Но таблица с нат.числами тоже не помешает, да.
...
Рейтинг: 0 / 0
Форумы / MySQL [игнор отключен] [закрыт для гостей] / запрос на выборку с разделением на года / 7 сообщений из 7, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]