Комплексный поворот в mysql - PullRequest
0 голосов
/ 20 января 2020

У меня есть таблица в MySQL, в которой есть данные, и я хочу добиться некоторого поворота из таблицы, что стало для меня сложным. Я пытался заглянуть в это , но мне кажется, что ничего не работает. Это структура моей таблицы:

roomid| day| 1 | 2 | 3 | 4 | 5 | 6 |
------+----+---+---+---+---+---+---+
1     | 1  |BIO|   |   |   |   |   |
1     | 2  |   |CHE|   |   |   |   |
1     | 3  |   |   |   |   |   |ENG|     
1     | 4  |   |   |KIS|   |   |   |
1     | 5  |   |   |   |   |   |PHY|  
2     | 1  |BIO|   |   |   |   |   | 
2     | 2  |   |CHE|   |   |   |   |
2     | 3  |   |   |   |   |ENG|   |     
2     | 4  |   |   |KIS|   |   |   | 
2     | 5  |   |   |   |   |   |PHY|     

Эта таблица содержит данные о расписании, идентификатор комнаты - это идентификатор комнаты, а день - дни с понедельника по пятницу (с 1 по 5). Столбцы с 1 по 6 являются идентификаторами периода. Мне нужно организовать данные для достижения результатов, которые показывают идентификаторы периодов для каждого класса, каждый день. что-то вроде этого:

|roomid| 1 | 2 | 3 | 4 | 5 | 6 | 1 | 2 | 3 | 4 | 5 | 6 | 1 | 2 | 3 | 4 | 5 | 6 | 1 | 2 | 3 | 4 | 5 | 6 | 1 | 2 | 3 | 4 | 5 | 6 |
-------+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+
1      |BIO|   |   |   |   |   |   |CHE|   |   |   |   |   |   |   |   |   |ENG|   |   |KIS|   |   |   |   |   |   |   |   |PHY|
2      |BIO|   |   |   |   |   |   |CHE|   |   |   |   |   |   |   |   |   |ENG|   |   |KIS|   |   |   |   |   |   |   |   |PHY|

Обратите внимание, что период повторяется для разных дней.

Ответы [ 2 ]

1 голос
/ 20 января 2020

Несмотря на то, что не претендует на окончательное решение, нормализованный дизайн может выглядеть следующим образом. Честно говоря, можно предположить, что нынешний дизайн как-то более уместен, чем этот.

+--------+-----+------+---------+
| roomid | day | slot | subject |
+--------+-----+------+---------+
|      1 |   1 |    1 | BIO     |
|      2 |   1 |    2 | BIO     |
|      1 |   2 |    2 | CHE     |
|      2 |   2 |    2 | CHE     |
|      1 |   4 |    3 | KIS     |
|      2 |   4 |    3 | KIS     |
|      2 |   3 |    5 | ENG     |
|      1 |   3 |    6 | ENG     |
|      1 |   5 |    6 | PHY     |
|      2 |   5 |    6 | PHY     |
+--------+-----+------+---------+
1 голос
/ 20 января 2020

Вы можете использовать условную агрегацию:

select room_id,
       max(case when day = 1 then slot_1 end) as day_1_slot_1,
       max(case when day = 1 then slot_2 end) as day_1_slot_2,
       . . . 
       max(case when day = 2 then slot_1 end) as day_2_slot_1,
       max(case when day = 2 then slot_2 end) as day_2_slot_2,
       . . . 
from schedule s
group by room_id
...