|
|
|
|
SELECT
spid_epid_social_data.date_birth,
FLOOR( ( CURDATE() - DATE(`date_birth`) ) / 10000 ) AS `age`,
COUNT(*) AS cnt
FROM
spid_epid_perosn
LEFT JOIN
spid_epid_social_data USING(id_person)
GROUP BY age
|
Мне нужно сделать группировку по полю age, только с некоторым условием. нужно сгруппировать так. От 0-16 лет, от 16-18,от 18 и более.
Можно липридумать что-то средствами mysql? | |
|
|
|
|
автор: ..... (29.08.2010 в 11:21) |
|
|
для: Моя тень
(28.08.2010 в 19:41)
| | в ORDER BY можно просто ставить условие, типа
ORDER BY age%18
GROUP BY работает только с именами столбцов результата
т.е. если SELECT tabl.*, (age%18) FROM ....
то GROUP BY '(age%18)' работать будет, хоть и коряво выглядит.
учитывая
>FLOOR( ( CURDATE() - DATE(`date_birth`) ) / 10000 ) AS `age`
и то что ещё нужно добавить , будет выглядеть ещё корявее :) | |
|
|
|
|
автор: ..... (29.08.2010 в 11:27) |
|
|
для: Моя тень
(28.08.2010 в 19:41)
| | если память не изменяет, даже алиасы нельзя подсунуть
, т.е (1+1) AS dwa ? , так и будет GROUP BY '(1+1) AS dwa' | |
|
|
|
|
|
|
|
для: .....
(29.08.2010 в 11:27)
| | но можно задать сложный запрос с определением столбика (и алиаса) во внутреннем, и группировкой по алиасу - во внешнем.
Причем выражение может быть не только арифметическим, но и условным (так что кусочно линеную функцию вполне можно задать - CASE ... THEN ... и т.д.)
кстати, свежие версии сервера не требуют такого изврата, и позволяют обходиться алиасом в GROUP BY (b соответственно одним уровнем SELECT)
ps. Вы бы зарегистрировались чтоли... | |
|
|
|
|
|
|
|
для: Trianon
(29.08.2010 в 11:39)
| | >но можно задать сложный запрос с определением столбика (и алиаса) во внутреннем, и группировкой по алиасу - во внешнем.
>Причем выражение может быть не только арифметическим, но и условным (так что кусочно линеную функцию вполне можно задать - CASE ... THEN ... и т.д.)
>
Trianon, покажите пожалуйста наглядно как так можно сделать? | |
|
|
|
|
|
|
|
для: Моя тень
(29.08.2010 в 12:07)
| | :)
непонятно что в результате хотите получить
>по полю age, только с некоторым условием. нужно сгруппировать так. От 0-16 лет, от 16-18,от 18 и более.
звучит как отсортировать.
Или имеете ввиду нужно три ряда с первой записью и подсчётами колличества записей отвечающих условию ? | |
|
|
|
|
|
|
|
для: heed
(29.08.2010 в 12:42)
| | Если правильно понял, то да. Вот вообщем примерно какой должен быть результ
0-16 | 30
16-18| 50
18 и более | 60
Тоесть в результате получится 3 записи с количеством людей. | |
|
|
|
|
|
|
|
для: Моя тень
(29.08.2010 в 12:07)
| | если дозволена группировка по алиасу
SELECT COUNT(*) AS cnt,
case when years < 16 then 0 when years < 18 then 1 else 2 end
AS kind ,
MIN(`years`) AS `miy`,
MAX(`years`) AS `may`
FROM(
SELECT FLOOR((DATEDIFF(CURDATE(), `bday`)/365.25)) as years
FROM `birth`
) as t
GROUP BY kind
|
если не дозволена -
SELECT
COUNT(*) AS cnt, kind,
MIN(`years`) AS `miy`,
MAX(`years`) AS `may`
FROM(
SELECT
years,
case when years < 16 then 0 when years < 18 then 1 else 2 end
AS kind
FROM(
SELECT
FLOOR((DATEDIFF(CURDATE(), `bday`)/365.25)) as years
FROM `birth`
) as t1
) as t2
GROUP BY kind
|
| |
|
|
|
|
|
|
|
для: Trianon
(29.08.2010 в 16:37)
| | Спасибо! Оба запроса подошли. | |
|
|
|