2015-10-14 3 views
0

Я новичок в SQL, который отделился от ряда примеров, которые относятся к тому, что я пытаюсь получить, но, похоже, не могут собрать все части , или даже подтвердить, выполнимо ли это в одном запросе. Моя Пример структуры данных:Запрос MySQL для нескольких счетчиков, возвращаемых для переменных диапазонов дат

Таблица: пользователя Поля: 'ID' (целое число) и 'дата_начала' (дата в формате ГГГГ-ММ-ДД)

Я пытаюсь написать один запрос, чтобы вернуть список счетчиков ('id'), где их «start_date» попадает в последний финансовый год с 1 июня по 31 мая. Однако больше, чем я хотел бы возврат с листингом предыдущих финансовых лет. Лучшее, что я был в состоянии собрать вместе:

SELECT COUNT(user.id) As "Total Members" FROM user WHERE user.start_date BETWEEN '2010-06-01' and '2011-05-31' UNION 
SELECT COUNT(user.id) FROM user WHERE user.start_date BETWEEN '2011-06-01' and '2012-05-31' UNION 
SELECT COUNT(user.id) FROM user WHERE user.start_date BETWEEN '2012-06-01' and '2013-05-31' UNION 
SELECT COUNT(user.id) FROM user WHERE user.start_date BETWEEN '2013-06-01' and '2014-05-31' UNION 
SELECT COUNT(user.id) FROM user WHERE user.start_date BETWEEN '2014-06-01' and '2015-05-31' UNION 
SELECT COUNT(user.id) FROM user WHERE user.start_date BETWEEN '2015-06-01' and DATE(CURDATE()) 

Есть две проблем с этим, кроме этого, кажется безвкусным. Во-первых, в то время как он делает возвращает правильное количество в колонке, мне нужно добавить ссылку год в соседней колонке, чтобы получить что-то вдоль линий:

Fiscal Year | Total Members 
---------------------------- 
    2011 |  #### 
    2012 |  #### 
    2013 |  #### 
    2014 |  #### 
    2015 |  #### 
    CURRENT |  #### 

и текущий запрос будет возвращать только Всего пользователей , И, во-вторых, я пытаюсь создать это примерно 40 лет назад (из 150 000 записей о членах), и я чувствую, что может быть лучший способ, используя модификатор на какой-либо функции года вместо жесткого кодирования диапазонов (ГОД -1, ГОД -2 и т. Д.). Думая, что логически я также вижу потенциальную проблему с получением правильной ссылки, возвращенной с правильным диапазоном, без чрезмерного усложнения. Любая помощь или совет будут очень признательны. Я признаю свои ограничения, и если то, что я ищу для написания, слишком сложно для поддержания, я могу придерживаться существующего списка примеров (который возвращается еще на 40 лет), если это необходимо. Заранее благодарю всех, кто вносит свой вклад!

ответ

0

Вы можете получить количество в год, делая некоторые арифметические и агрегацию

SELECT YEAR(DATE_SUB(u.start_date, interval 5 month)) as fy, 
     COUNT(*) As TotalMembers 
FROM user u 
WHERE user.start_date BETWEEN '2010-06-01' and '2011-05-31' UNION 
GROUP BY YEAR(DATE_SUB(u.start_date, interval 5 month)) 
ORDER BY fy; 

Я не уверен, что " CURRENT ".

Если вы хотите всего за все годы, то вы можете использовать with rollup:

SELECT COALESCE(CAST(YEAR(DATE_SUB(u.start_date, interval 5 month)) as CHAR(25)), 
       'Current') as fy, 
     COUNT(*) As TotalMembers 
FROM user u 
WHERE user.start_date BETWEEN '2010-06-01' and '2011-05-31' UNION 
GROUP BY YEAR(DATE_SUB(u.start_date, interval 5 month)) WITH ROLLUP 
ORDER BY fy; 
0

Я думаю, вы должны использовать группу заявлением:

SELECT 
To_number(to_char(user.start_date, 'YYYY')) AS YEAR 
,COUNT(user.id) As "Total Members" 
FROM user 
GROUP BY 
To_number(to_char(user.start_date, 'YYYY')) 
Смежные вопросы