我正在寻找一种方法来循环遍历MYSQL表中的列,使用连接字符串来索引循环中的列名。表中数据的示例可能如下所示:
R1 R2 R3 R4
0.68 0.08 0.04 4.24
0.15 1.17 3.06 0.57
1.59 0.48 1.39 1.00
1.59 0.77 1.13 0.22
0.90 0.23 0.73 0.52
列名只是字符" R"和一个数字(最终列数会有所不同,所以数字可能会达到100)。我想迭代列来计算每列中超过阈值的值的数量(我使用三个阈值:3.0,5.0和10.0)。调用该过程的结果应如下所示:
str2 total ThreeCount FiveCount TenCount
`R1` 8772 794 153 1
str2 total ThreeCount FiveCount TenCount
`R2` 8772 382 42 0
等
我一直使用以下代码作为存储过程来测试进程(我使用5进行测试,因此迭代前五列数据值):
BEGIN
DECLARE x INT;
DECLARE str1 VARCHAR(1);
DECLARE str2 VARCHAR(5);
DECLARE str3 VARCHAR(1);
SET x = 1;
SET str1 = "R";
SET str2 = "";
SET str3 = "`";
WHILE x <= 5 DO
SET str2 = CONCAT(str3,str1,x,str3);
select str2,
count(*) total,
sum(case when str2 > 3.0 then 1 else 0 end) ThreeCount,
sum(case when str2 > 5.0 then 1 else 0 end) FiveCount,
sum(case when str2 > 10.0 then 1 else 0 end) TenCount
from test_dat;
SET x = x + 1;
END WHILE;
END
然而,除非我替换&#34; str2&#34;否则程序返回零值(总数除外)。使用实际列名称(例如将str2替换为R1
,R2
等)。但是我宁愿不使用实际的列名。
如何将连接字符串(str2)识别为列名?我尝试了各种串联组合,例如:
SET str2 = CONCAT(str1,x);
但是没有任何一个非零计数。
感谢您提供任何帮助。
答案 0 :(得分:3)
标准化设计可能看起来像这样
id r val
1 1 0.68
2 1 0.15
3 1 1.59
4 1 1.59
5 1 0.90
6 2 0.08
7 2 1.17
8 2 0.48
9 2 0.77
10 2 0.23
11 3 0.04
12 3 3.06
13 3 1.39
14 3 1.13
15 3 0.73
16 4 4.24
17 4 0.57
18 4 1.00
19 4 0.22
20 4 0.52