2016-08-16 29 views
0
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:

謝謝!

我使用MySQL工作臺6.3.7

+0

你想三種結果或一個實現這一目標?我的意思是你想要一個選擇嗎? – MSL

+0

我想要一個選擇 – BOB

回答

0

您可以用INFORMATION_SCHEMA.COLUMNS的幫助和PREPARE 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; 
+0

我試過,但它不工作,我想我做錯了 – BOB

+0

我已經更新了答案,以表明你應該把數據庫名稱和表名 – 1000111

-1

你必須使用Procedure這個

DELIMITER $$ 
CREATE PROCEDURE ABC() 

BEGIN 
    DECLARE a INT Default 1 ; 
    simple_loop: LOOP   
    SELECT sum([email protected]) FROM [email protected] WHERE [email protected] > 0; 
    SET a=a+1; 
    IF a=4 THEN 
     LEAVE simple_loop; 
    END IF; 
END LOOP simple_loop; 
END $$ 

要調用存儲過程使用

CALL `ABC`() 
+0

爲什麼'a'不是被聲明爲'decimal'類型? –

+0

'INT'用於整數; DECIMAL是用於有十進制數字的數字。 –

+0

這個答案是那裏的一半。實際上你必須通過'CONCAT()'構造'SELECT'並使用'prepare'和'execute'語句。一團糟。你最好用客戶端語言(PHP/Java/VB/...)來做。 –

0

爲什麼你需要做到這一點一個函數?您正在查找的結果可以從單個查詢中獲得。

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 
+0

謝謝,但我不想做manualy,因爲在這個例子中,我只有t1,t2,t3,但是當我有t1到t50或t50000時,我該怎麼辦? – BOB

+0

不要使用**列** t1到t50000創建表。相反,將這些列標題視爲** A **代碼列中的代碼值,並在另一列中具有關聯值,並且具有許多行**而不是許多列。那麼你不需要循環,只需通過查詢就可以得到一個簡單的組。 –

+0

謝謝你的建議,在這個例子中,我創建了表格,但在我個人的情況下,我沒有創建它,表格是從excel導入的,最多有50列,我不想編輯它。 – BOB