我的桌子看起来像:
ID | a | b | sth_CH | sth_DD | sth_FF | ...
1 | xx | yy | 1 | 5 | 3 | ...
2 | xy | yx | 3 | 1 | 6 | ...
在那里,您可以看到我可以拥有名为sth_XX ...
的其他列(越来越多)问题:
如何将第四列(sth_CH
)的值与最后一列相加?
我们可以假设我不知道列的名称,但我知道它从" sth _"开始。 (但我认为没有必要)。
我想要SUM(4,table.columns.count)
之类的东西,而这个SUM的所有值都是从第四列到最后一列。
对于SUM(4,6)
,我想要回复:
9
10
答案 0 :(得分:1)
我也同意您应该规范化您的数据模型。但是,如果你无法做到,这个脚本可以完成这项工作:
set @a := ' ';
select @a := concat(@a, COLUMN_NAME, ' + ')
from INFORMATION_SCHEMA.COLUMNS
where TABLE_SCHEMA ='your schema'
and TABLE_NAME='your table'
and column_name not in ('ID', 'a', 'b');
set @a := LEFT(@a, length(@a) -2);
set @sql := concat('select ', @a, ' from <your table> where ...');
prepare stmt from @sql;
execute stmt;
deallocate prepare stmt;
编辑:我后来才明白不需要聚合,您需要添加列值。删除了聚合函数&#34; sum&#34;从代码。 附:如果它解决了你的问题,请标记为答案。
答案 1 :(得分:0)
只是一些指示,我认为正如评论中所建议的那样,你需要考虑重新设计。我将根据您提供的项目和信息的有限知识来回答。
您应该创建一个表格来保存您提到的这些“特殊代码”作为附加列。比你将有一个多对多表将特殊代码链接到你的表,这是我在想的:
原始表减去您在示例中添加的列数组:
ID | a | b
1 | xx | yy
2 | xy | yx
新特殊代码表:
ID | special_code
1 | sth_CH
2 | sth_DD
3 | sth_FF
...
链接表:
original_table_id | special_code_id
1 | 1
1 | 2
1 | 3
2 | 1
2 | 2
2 | 3
这将允许您拥有无穷无尽的特殊代码,并使您可以轻松获得特定ID的总和。
正如旁注,如果可以在不暴露您的秘密的情况下提供更多信息总是更好。它将允许其他人谈论您的代码等...并直接将其与您的示例相关联。
答案 2 :(得分:0)
下面的代码将给出动态列名,并形成可以准备和执行的动态sql脚本。
下面的sql脚本将动态获取列名跳过前三个并形成字段列表的sql脚本:
select group_concat(concat("sum(",column_name,") as sum_",column_name)) into @field_list from
(select @marker:=if(@marker<4,@marker+1,@marker) as marker,column_name
from information_schema.columns,(select @marker:=0)t
where table_name='t1') temp where marker>=4 group by marker;
生成sql脚本:
set @query= concat("Select ",@field_list," from t1");
执行:
PREPARE stmt FROM @query;
EXECUTE stmt;
假设: - 表名为t1