一次旋转 table 4 行
Pivot a table 4 rows at a time
我正在尝试找出如何通过以下方式在 SQL 服务器中旋转 table:
每次值为 "PEAK",我希望它从新的一行开始。基本上它看起来像这样。
col1 col2 col3 col4
119 KH ON PEAK
4 K1 ON PEAK
356 KH OFF PEAK
38 K1 ... ...
老实说,我真的很想知道源数据是如何存储的。如果数据已经存储在正确的行中,那么拆分它会容易得多,这看起来工作量很大。 .
大体上我必须这样做...除了枢轴之外的所有操作都已完成...
select bar, (row_number() over (order by a.b)-.001)/4 grpOrder,
floor((row_number() over (order by a.b)-.001)/4) as grp
from foo
cross join (Select 1 as b) a
这是 oracle 尝试的屏幕截图,我现在无法让 SQL fiddle 使用 SQL 服务器。
从这里您可以根据 morder 的十进制值对数据进行透视,每一行都将基于 grp。
我不得不使用交叉连接来获取一个值来排序,但我需要它是一致的,所以 table foo 的顺序将被保留,尽管这绝不是保证。我建议为您的拆分数据添加一个 ID 或序列,否则顺序可能会损坏。如果这样做了,我们就不再需要交叉连接了。并且 over order by 中的 order by 可以设置为该自动编号值。
我假设您从这里可以弄清楚如何转向。因为 MOrder 的每个十进制值在每个组内都是相同的。
以及完整的数据透视表(再次使用 oracle)
如果每个组中的值数量是动态的,那么我们必须编写一些动态的 SQL 来处理这些情况;我这里没有这样做。
我正在尝试找出如何通过以下方式在 SQL 服务器中旋转 table:
每次值为 "PEAK",我希望它从新的一行开始。基本上它看起来像这样。
col1 col2 col3 col4
119 KH ON PEAK
4 K1 ON PEAK
356 KH OFF PEAK
38 K1 ... ...
老实说,我真的很想知道源数据是如何存储的。如果数据已经存储在正确的行中,那么拆分它会容易得多,这看起来工作量很大。 .
大体上我必须这样做...除了枢轴之外的所有操作都已完成...
select bar, (row_number() over (order by a.b)-.001)/4 grpOrder,
floor((row_number() over (order by a.b)-.001)/4) as grp
from foo
cross join (Select 1 as b) a
这是 oracle 尝试的屏幕截图,我现在无法让 SQL fiddle 使用 SQL 服务器。
从这里您可以根据 morder 的十进制值对数据进行透视,每一行都将基于 grp。
我不得不使用交叉连接来获取一个值来排序,但我需要它是一致的,所以 table foo 的顺序将被保留,尽管这绝不是保证。我建议为您的拆分数据添加一个 ID 或序列,否则顺序可能会损坏。如果这样做了,我们就不再需要交叉连接了。并且 over order by 中的 order by 可以设置为该自动编号值。
我假设您从这里可以弄清楚如何转向。因为 MOrder 的每个十进制值在每个组内都是相同的。
以及完整的数据透视表(再次使用 oracle)
如果每个组中的值数量是动态的,那么我们必须编写一些动态的 SQL 来处理这些情况;我这里没有这样做。