#mysql #sql #string #sum #aggregate-functions
#mysql #sql #строка #сумма #агрегатные функции
Вопрос:
У меня есть столбец периода в таблице со значениями в формате Year-SemiQuarter
. Пример 2016-BQ1, 2016-BQ2, 2016-BQ3 ……. 2016-BQ8, где BQ1 и BQ2 вместе составляют 1 квартал за соответствующий год. Аналогично для других
Теперь я хочу сгруппировать результат по
Четверть
Моя таблица выглядит примерно так. Разделили период на две колонки.
==================== ============= ================ ================================== ===== ======================================
| totalNumberOfUnits | productType | productSubType | SUBSTRING_INDEX(rsh.period, '-', 1 ) | SUBSTRING_INDEX(rsh.period, '-', -1) |
==================== ============= ================ ================================== ===== ======================================
| 1084 | Apartment | High Rise | 2018 | BQ1 |
-------------------- ------------- ---------------- ---------------------------------- ----- --------------------------------------
| 1284 | Apartment | High Rise | 2018 | BQ2 |
-------------------- ------------- ---------------- ---------------------------------- ----- --------------------------------------
| 1883 | Apartment | High Rise | 2018 | BQ3 |
-------------------- ------------- ---------------- ---------------------------------- ----- --------------------------------------
| 183 | Apartment | High Rise | 2018 | BQ4 |
-------------------- ------------- ---------------- ---------------------------------- ----- --------------------------------------
| 898 | Apartment | High Rise | 2018 | BQ5 |
-------------------- ------------- ---------------- ---------------------------------- ----- --------------------------------------
| 2377 | Apartment | High Rise | 2018 | BQ7 |
-------------------- ------------- ---------------- ---------------------------------- ----- --------------------------------------
| 2953 | Apartment | High Rise | 2018 | BQ8 |
-------------------- ------------- ---------------- ---------------------------------- ----- --------------------------------------
Результат должен быть :
==================== ==
| totalNumberOfUnits | |
==================== ==
| 2368 | |
-------------------- --
| 2066 | |
-------------------- --
| 898 | |
-------------------- --
| 5330 | |
-------------------- --
Итак totalNumberOfUnits
, за 1-й квартал 2018 года — 2368, что является суммой BQ1 и BQ2. То же самое относится и к другим. Данных для BQ6 нет, поэтому totalNumberOfUnits
будет 898, что соответствует общему количеству единиц для semi-quarter
BQ5
Это может быть очень тривиально, но я не уверен, как это сделать. Не удалось найти тот же вариант использования в Stack Overflow. Спасибо за помощь!!
Версия MySQL, которую я использую, — 5.7.26
Ответ №1:
Вы можете использовать строковые функции и агрегирование:
select
left(period, 4) as yyyy,
floor((right(rsh.period, 1) 1) / 2) as q,
sum(totalNumberOfUnits) as totalNumberOfUnits
from mytable
group by yyyy, q
Комментарии:
1. вы могли бы просто использовать ceil вместо floor и 1, я думаю?
2. @ysth: действительно, да. Я просто как-то больше привык
floor()
.3. Кстати, ceil не даст правильного значения для BQ8. это дало бы 5, но ожидалось 4, так что этаж должен быть в порядке. Спасибо!!
4. да, при замене пола на потолок вам также необходимо снять
1
5. Хорошо, извините, я пропустил 1 в вашем предыдущем комментарии. Спасибо за разъяснение!!
Ответ №2:
GROUP BY SUBSTRING_INDEX(rsh.period, '-', 1 ), (SUBSTRING_INDEX(rsh.period, 'Q', -1) 1) DIV 2
Комментарии:
1. Спасибо, это было быстро 🙂