SQL 如何将每 5 个值合并到 1 条记录 *
有数据库表TBL_FILE,数据如下所示:
FILE
B.jpg
X.jpg
H.png
C.png
A.gif
G.pdf
Y.docx
U.jpeg
需要每5个值合并到1条记录,结果如下所示:
A
B
C
D
E
B.jpg
X.jpg
H.png
C.png
A.gif
G.pdf
Y.docx
U.jpeg
MySQL的SQL:
SELECT MAX(CASE
WHEN RN % 5 = 0 THEN FILE
END) AS FILEA
, MAX(CASE
WHEN RN % 5 = 1 THEN FILE
END) AS FILEB
, MAX(CASE
WHEN RN % 5 = 2 THEN FILE
END) AS FILEC
, MAX(CASE
WHEN RN % 5 = 3 THEN FILE
END) AS FILED
, MAX(CASE
WHEN RN % 5 = 4 THEN FILE
END) AS FILEE
FROM (
SELECT T.*, ROW_NUMBER() OVER (ORDER BY ID) - 1 AS RN
FROM TBL_FILE T
) T
GROUP BY FLOOR(RN / 5)
这道题其实很简单,建立一个5列的空表,再依次将各值逐列、逐行地追加至该表即可。但是SQL写起来就很麻烦了,需要额外的id列确保顺序,再通过繁琐的办法人为造出序号,最后利用序号再将数据拆成5列。如果遇到动态列的情况,SQL就更难写了。
用开源集算器的SPL就很容易写:
A |
|
1 |
=connect("mysql") |
2 |
=A1.query@xi("SELECT * FROM TBL_FILE") |
3 |
=create(A,B,C,D,E).record(A2) |
SPL直接支持动态数据结构和有序计算,很容易将多个值按次序追加至表中。
https://stackoverflow.com/questions/64133340/how-to-convert-mysql-rows-to-a-column-of-5
英文版