总结未知数量的字段

时间:2014-03-14 11:07:57

标签: mysql

SELECT *让我选择给定表格的所有字段。当我不知道所有或字段的名称时,或者当我不想修复有问题的查询时(为了允许表更改的灵活性),我使用它。

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(*)之类的东西 - 但这会引起语法错误。

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

1 个答案:

答案 0 :(得分:0)

是的,您可以使用信息架构。也就是说,即使有可能,但这并不意味着它是个好主意。

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类型的列。将其更改为处理其他列类型非常简单。