MYSQL ГРУППИРУЕТ ПО паре значений с определенным столбцом

#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. Спасибо, это было быстро 🙂