mysql中最新列的总和部分

时间:2015-08-23 15:43:00

标签: mysql

我的桌子看起来像:

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

3 个答案:

答案 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