mysql - 对未知数量的字段求和

标签 mysql

SELECT * 让我选择给定表的所有字段。当我不知道所有字段或字段的名称,或者当我不想修复有问题的查询(以允许在表更改方面具有灵 active )时,我会使用它。

SELECT SUM(col) 让我计算表中特定列的总和,我知道其字段名称。

我能以某种方式将两者结合起来吗?

例如,如果 SELECT * FROM TestTable 返回以下内容:

+------+------+------+
| col1 | col2 | col3 |
+------+------+------+
|    1 |    2 |    3 |
|    2 |    3 |    4 |
|    3 |    4 |    5 |
+------+------+------+

然后我希望得到如下输出:

+-----------+-----------+-----------+
| SUM(col1) | SUM(col2) | SUM(col3) |
+-----------+-----------+-----------+
|         6 |         9 |        12 |
+-----------+-----------+-----------+

不在查询中使用字段名称col1col2col3(当然,标题行可以是任何其他内容)。类似 SELECT SUM(*) 的东西——但这会引发语法错误。

也许我可以以某种方式使用信息模式?或者有没有更简单的方法?

最佳答案

是的,您可以为此使用信息模式。也就是说,即使某些事情是可能的,也不意味着它就是一个好主意。

delimiter $$
CREATE PROCEDURE colsum( tbl char(32))
BEGIN
DECLARE cur1_eof INT DEFAULT FALSE;
DECLARE cname CHAR(128);

DECLARE cur1 CURSOR FOR SELECT COLUMN_NAME FROM information_schema.columns WHERE table_schema=database() AND table_name=tbl AND data_type="int";
DECLARE CONTINUE HANDLER FOR NOT FOUND SET cur1_eof = TRUE;

SELECT '' INTO @qs;

OPEN cur1;

cols: LOOP
 FETCH cur1 INTO cname;
 IF cur1_eof THEN
  LEAVE cols;
 END IF;
 SELECT CONCAT(@qs,IF(length(@qs)>0,',',''),'SUM(',cname,') AS ',cname) INTO @qs;
END LOOP;

CLOSE cur1;

SELECT CONCAT('SELECT ',@qs,' FROM ',tbl,';') INTO @qs;

PREPARE s1 FROM @qs;
EXECUTE s1;
DEALLOCATE PREPARE s1;

END
$$
delimiter ;

然后您可以使用 call colsum('your_table'); 来获得预期的列总和。上面的示例仅列出类型为 INT 的列。更改它以处理其他列类型相当简单。

关于mysql - 对未知数量的字段求和,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22403315/

相关文章:

mysql - 单行汇总表应该有主键吗?

php - 如何使用连续的服务器端处理来制作不断更新数据库信息的新闻源?

sql - Sql如何只返回所有重复的条目

mysql - PostgreSQL 相当于 "SET SESSION query_cache_type = ON/OFF";

mysql - 一对多,在一个查询中选择一个和多个

php - 从 mysql 查询创建列表

mysql - 合并MySQL中的两个表

mysql - 卡住!如何连接三个 SQL 表来回答这两个问题?或者我不需要?

OR 条件的 MySQL 复合索引

php - 如何从与另一个表具有一对多关系的表中选择特定列?