用for循环替换多个"select"

Replace multiple "select" with for loop

CREATE TABLE tab_1 (
    t1 decimal (10),
    t2 decimal (10),
    t3 decimal (10)
);

INSERT INTO tab_1 (t1, t2, t3) VALUES ( 1, -2, -5);
INSERT INTO tab_1 (t1, t2, t3) VALUES (-3,  4,  6);
INSERT INTO tab_1 (t1, t2, t3) VALUES ( 5,  1,  2);


SELECT sum(t1) FROM tab_1 WHERE t1 > 0;
SELECT sum(t2) FROM tab_1 WHERE t2 > 0;
SELECT sum(t2) FROM tab_1 WHERE t3 > 0;`

我有一个类似上面的查询,我需要一个可以用 for i=1:3

替换三个 select 的脚本

输出必须是这样的:

Q_total:

6

5

8

谢谢!

我用MYSQLWorkbench6.3.7

您必须为此使用 Procedure

DELIMITER $$  
CREATE PROCEDURE ABC()

BEGIN
  DECLARE a INT Default 1 ;
  simple_loop: LOOP         
     SELECT sum(t@a) FROM tab_@a WHERE t@a > 0;
     SET a=a+1;
     IF a=4 THEN
        LEAVE simple_loop;
     END IF;
 END LOOP simple_loop;
END $$

调用该存储过程使用

CALL `ABC`()

为什么需要在函数中执行此操作?您要查找的结果可以通过单个查询给出。

SELECT SUM(CASE WHEN t1 > 0 THEN t1 ELSE 0 END) AS t1Sum,
       SUM(CASE WHEN t2 > 0 THEN t2 ELSE 0 END) AS t2Sum,
       SUM(CASE WHEN t3 > 0 THEN t3 ELSE 0 END) AS t3Sum
FROM tab_1

您可以在 INFORMATION_SCHEMA.COLUMNSPREPARE statement

的帮助下实现此目的
SET @sql := '';
SELECT 
GROUP_CONCAT('SELECT SUM(',COLUMN_NAME,') FROM tab_1 WHERE ',COLUMN_NAME, ' > 0' SEPARATOR ' UNION ALL ') INTO @sql
FROM information_schema.COLUMNS 
WHERE TABLE_SCHEMA ='your_database_name'
AND TABLE_NAME ='your_table_name';

PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE stmt;