我想写一个通用的mysql查询,它可以将输入表转换为输出表 基本上值是根据 w_number 进行转移的
这些表只是示例,我需要一个可以将列最多移动 60 的查询。
我尝试构建一些逻辑以获得这样的查询,这似乎有效
SELECT
w_number,
CASE WHEN w_number = 1 THEN value_1
WHEN w_number > 1 AND w_number <= 7 THEN
CASE WHEN w_number = 2 THEN value_7
WHEN w_number = 3 THEN value_6
WHEN w_number = 4 THEN value_5
WHEN w_number = 5 THEN value_4
WHEN w_number = 6 THEN value_3
WHEN w_number = 7 THEN value_2
ELSE NULL END
ELSE NULL END AS value_1,
CASE WHEN w_number = 1 THEN value_2
WHEN w_number > 1 AND w_number <= 7 THEN
CASE WHEN w_number = 2 THEN value_1
WHEN w_number = 3 THEN value_7
WHEN w_number = 4 THEN value_6
WHEN w_number = 5 THEN value_5
WHEN w_number = 6 THEN value_4
WHEN w_number = 7 THEN value_3
ELSE NULL END
ELSE NULL END AS value_2,
CASE WHEN w_number = 1 THEN value_3
WHEN w_number > 1 AND w_number <= 7 THEN
CASE WHEN w_number = 2 THEN value_2
WHEN w_number = 3 THEN value_1
WHEN w_number = 4 THEN value_7
WHEN w_number = 5 THEN value_6
WHEN w_number = 6 THEN value_5
WHEN w_number = 7 THEN value_4
ELSE NULL END
ELSE NULL END AS value_3,
CASE WHEN w_number = 1 THEN value_4
WHEN w_number > 1 AND w_number <= 7 THEN
CASE WHEN w_number = 2 THEN value_3
WHEN w_number = 3 THEN value_2
WHEN w_number = 4 THEN value_1
WHEN w_number = 5 THEN value_7
WHEN w_number = 6 THEN value_6
WHEN w_number = 7 THEN value_5
ELSE NULL END
ELSE NULL END AS value_4,
CASE WHEN w_number = 1 THEN value_5
WHEN w_number > 1 AND w_number <= 7 THEN
CASE WHEN w_number = 2 THEN value_4
WHEN w_number = 3 THEN value_3
WHEN w_number = 4 THEN value_2
WHEN w_number = 5 THEN value_1
WHEN w_number = 6 THEN value_7
WHEN w_number = 7 THEN value_6
ELSE NULL END
ELSE NULL END AS value_5,
CASE WHEN w_number = 1 THEN value_6
WHEN w_number > 1 AND w_number <= 7 THEN
CASE WHEN w_number = 2 THEN value_5
WHEN w_number = 3 THEN value_4
WHEN w_number = 4 THEN value_3
WHEN w_number = 5 THEN value_2
WHEN w_number = 6 THEN value_1
WHEN w_number = 7 THEN value_7
ELSE NULL END
ELSE NULL END AS value_6,
CASE WHEN w_number = 1 THEN value_7
ELSE NULL END AS value_7
FROM your_table_name
ORDER BY w_number;
参见示例
select *
,JSON_EXTRACT(ar,concat('$[',(7-idx+0)%7,']'))value_1
,JSON_EXTRACT(ar,concat('$[',(7-idx+1)%7,']'))value_2
,JSON_EXTRACT(ar,concat('$[',(7-idx+2)%7,']'))value_3
,JSON_EXTRACT(ar,concat('$[',(7-idx+3)%7,']'))value_4
,JSON_EXTRACT(ar,concat('$[',(7-idx+4)%7,']'))value_5
,JSON_EXTRACT(ar,concat('$[',(7-idx+5)%7,']'))value_6
,JSON_EXTRACT(ar,concat('$[',(7-idx+6)%7,']'))value_7
-- ,(7-idx+0)%7 i1,(7-idx+1)%7 i2,(7-idx+2)%7 i3,(7-idx+3)%7 i4,(7-idx+4)%7 i5
-- ,(7-idx+5)%7 i6,(7-idx+6)%7 i7
from(
select id,w_number,json_array(value_1,value_2,value_3,value_4,value_5,value_6,value_7) ar
,w_number-1 idx
from test
)jsa
输出是
id | w_number | ar | idx | 值_1 | 值_2 | 值_3 | 值_4 | 值_5 | 值_6 | 值_7 |
---|---|---|---|---|---|---|---|---|---|---|
1 | 5 | [10, 20, 空, 空, 空, 空, 空] | 4 | 空 | 空 | 空 | 空 | 10 | 20 | 空 |
2 | 4 | [空、50、60、70、空、空、空] | 3 | 空 | 空 | 空 | 空 | 50 | 60 | 70 |
3 | 2 | [空,90,空,110,空,空,空] | 1 | 空 | 空 | 90 | 空 | 110 | 空 | 空 |
4 | 2 | [空、空、30、40、空、空、空] | 1 | 空 | 空 | 空 | 30 | 40 | 空 | 空 |
5 | 1 | [50,60,70,90,空,空,空] | 0 | 50 | 60 | 70 | 90 | 空 | 空 | 空 |
6 | 3 | [90, 100, 110, 120, 空, 空, 空] | 2 | 空 | 空 | 90 | 100 | 110 | 120 | 空 |
7 | 5 | [空、50、60、70、空、空、空] | 4 | 70 | 空 | 空 | 空 | 空 | 50 | 60 |
8 | 1 | [1,2,3,4,5,6,7] | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
9 | 2 | [1,2,3,4,5,6,7] | 1 | 7 | 1 | 2 | 3 | 4 | 5 | 6 |
10 | 3 | [1,2,3,4,5,6,7] | 2 | 6 | 7 | 1 | 2 | 3 | 4 | 5 |
11 | 4 | [1,2,3,4,5,6,7] | 3 | 5 | 6 | 7 | 1 | 2 | 3 | 4 |
12 | 5 | [1,2,3,4,5,6,7] | 4 | 4 | 5 | 6 | 7 | 1 | 2 | 3 |
13 | 6 | [1,2,3,4,5,6,7] | 5 | 3 | 4 | 5 | 6 | 7 | 1 | 2 |
14 | 7 | [1,2,3,4,5,6,7] | 6 | 2 | 3 | 4 | 5 | 6 | 7 | 1 |
15 | 8 | [1,2,3,4,5,6,7] | 7 | 1 | 2 | 3 | 4 | 5 | 6 | 7 |