Преобразовать таблицу из последовательного идентификатора в реальный с атрибутами - PullRequest
0 голосов
/ 28 апреля 2020

Я изменил, но контекст, но это в основном та же проблема.

Представьте, что мы находимся в бесконечном туннеле в форме круга. Мы разбиваем каждую секцию круга, от 1 до 10, и будем называть каждую секцию slot (sl). В туннеле ходят 2 groups (gr) живых существ. Каждая группа имеет 2 bands, где каждая имеет name и глобальный hitpoints (hp). Каждая группа идет вперед (хотя группы могут изменить порядок). Если группа находится в слоте № 10 и движется вперед, он будет в слоте № 1. Мы снимаем их информацию каждые day. Все собранные данные хранятся в таблице с такой структурой:

+----------+----------------+------------------+----------------+----------------+------------------+----------------+----------------+------------------+----------------+----------------+------------------+--------------+--+
| day_id | | gr_1_sl_1_id | | gr_1_sl_1_name | | gr_1_sl_1_hp | | gr_1_sl_2_id | | gr_1_sl_2_name | | gr_1_sl_2_hp | | gr_2_sl_1_id | | gr_2_sl_1_name | | gr_2_sl_1_hp | | gr_2_sl_2_id | | gr_2_sl_2_name | | gr_2_sl_2_hp |  |
+----------+----------------+------------------+----------------+----------------+------------------+----------------+----------------+------------------+----------------+----------------+------------------+--------------+--+
|        1 |              3 | orc              |            100 |              4 | goblin           |             10 |             10 | human            |             50 |              1 | dwarf            |           25 |  |
|        2 |              6 | goblin           |              7 |              7 | orc              |             76 |              2 | human            |             60 |              3 | dwarf            |           28 |  |
+----------+----------------+------------------+----------------+----------------+------------------+----------------+----------------+------------------+----------------+----------------+------------------+--------------+--+

Как видите, столбцы структурированы последовательно, а данные показывают, что является фактическим значением. Вместо этого я хочу, чтобы информация формировалась таким образом:

+---------+-------+-------+-----------+---------+
| id_game | gr_id | sl_id | band_name | band_hp |
+---------+-------+-------+-----------+---------+
|       1 |     1 |     3 | orc       |     100 |
|       1 |     1 |     4 | goblin    |      10 |
|       1 |     2 |    10 | human     |      50 |
|       1 |     2 |     1 | dwarf     |      25 |
|       2 |     1 |     6 | goblin    |       7 |
|       2 |     1 |     7 | orc       |      76 |
|       2 |     2 |     2 | human     |      60 |
|       2 |     2 |     3 | dwarf     |      28 |
+---------+-------+-------+-----------+---------+

У меня есть эта информация в power bi, хотя я могу создавать представления на сервере sql, если это необходимо. Я перепробовал много вещей, самым близким, что я получил, было разворачивание и разбор исходных столбцов, чтобы получить day_id, gr_id, sl_id, attributes и values. В attributes и values это, в основном, имя и hp с соответствующим значением (я изменил hp на строку), но потом у меня есть запас, я не уверен, что делать дальше.

Кто угодно есть какие-нибудь идеи? Имейте в виду, что я упростил проблему; там больше групп, больше слотов, больше полос и больше статистики (то есть рейтинг атаки и защиты и т. д. c.)

1 Ответ

1 голос
/ 28 апреля 2020

Кажется, вы хотите отменить поворот стола. В SQL Server я рекомендую использовать apply:

select t.day_id, v.*
form t cross apply
     (values (1, 1, gr_1_sl_1_id, gr_1_sl_1_name, gr_1_sl_1_hp),
             (1, 2, gr_1_sl_2_id, gr_1_sl_2_name, gr_1_sl_2_hp),
             (2, 1, gr_2_sl_1_id, gr_1_sl_1_name, gr_2_sl_1_hp),
             (2, 2, gr_2_sl_2_id, gr_1_sl_2_name, gr_2_sl_2_hp)
     ) v(id_game, gr_id, sl_id, band_name, band_hp);

В других базах данных вы можете сделать нечто подобное с union all.

...