我更改了上下文,但是基本上是相同的问题。
想象我们在一个永无止境的隧道中,形状像个圆形。我们将圆的每个部分从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 server中创建视图。我尝试了很多事情,最接近的事情是取消透视并解析原始列以获得day_id
,gr_id
,sl_id
,attributes
和values
。在attributes
和values
中,基本上是名称和hp及其对应的值(我将hp更改为字符串),但随后我有了库存,我不确定下一步该怎么做。
有人有什么想法吗?请记住,我简化了这个问题;有更多的组,更多的插槽,更多的乐队和更多的统计信息(例如,攻击和防御等级等)
您似乎想取消桌子的旋转。在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
做类似的事情。