SQL 打印矩阵 (一)
使用 SQL 输出 5 x 5 的矩阵,矩阵的值由 1~25 填充,实现的效果如下表所示。
A |
B |
C |
D |
E |
---|---|---|---|---|
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
经观察可知,
- 排在同一行的数是因为它们本身除 5 后再向上取整得到的是同一个值;
- 排在同一列的数是因为它们本身对 5 求余的结果一致;
- 同一行的数从左到右是递增;同样,同一列的数从上到下也是递增的。
因此,我们可以将 1~25 的数除 5 后再向上取整得到的值作为分组的依据;同时,1~25 对 5 求余结果为 1 的放到 A 列,结果为 2 的放到 B 列,结果为 3 对应的是 C 列,结果为 4 对应的是 D 列,E 列则放结果为 0 的数。
第一步,生成 1~25 的数。
可借助数字表或者使用递归达到此目的,本文使用的是递归的方式。
WITH recursive t_seq (num) AS
(SELECT
1 AS num
UNION
SELECT
num + 1 AS num
t_seq
WHERE num < 25)
SELECT * FROM t_seq
第二步,计算出每个数字对应的组号,依据求余的结果做行转列处理。
x0 AS
(SELECT
CEIL(num / 5) AS group_no
t_seq),
x1 AS
(SELECT
group_no AS row_no,
MAX(IF(num % 5 = 1, num, NULL)) AS A,
MAX(IF(num % 5 = 2, num, NULL)) AS B,
MAX(IF(num % 5 = 3, num, NULL)) AS C,
MAX(IF(num % 5 = 4, num, NULL)) AS D,
MAX(IF(num % 5 = 0, num, NULL)) AS E
GROUP BY group_no)
SELECT A ,B ,C ,D ,E FROM x1
最终输出>>>
A B C D E
------ ------ ------ ------ --------