2017-10-14 44 views
0

我想創建一個函數,它返回所有我的頂級銷售額的總和,但我收到此錯誤。不允許從函數返回結果集

DELIMITER ++ 

CREATE FUNCTION CostOfBestBuyers(number INT) RETURNS INT 
BEGIN 
    SELECT SUM(Tprice) 
     FROM (SELECT SUM(T.Quantity * S.ProductPrice) AS Tprice 
       FROM Transaction T JOIN Stocks S ON T.ProductCode = S.ProductCode 
      GROUP BY UserCode ORDER BY 1 DESC LIMIT number) AS subquery; 
END++ 

DELIMITER ; 

SQL語句本身只返回一個值,但是當我將查詢放入函數時,它返回一個錯誤。

+1

什麼是錯誤訊息? –

+0

不好的做法,將您的別名命名爲與SQL函數名稱中內置的相同,順便說一下 – WillardSolutions

+0

等待,查詢本身起作用,但是當您將它放入函數中時,它不再起作用了?你是否嘗試創建一個程序? – wast

回答

0

我認爲你只是缺少一個RETURN

DELIMITER ++ 

CREATE FUNCTION CostOfBestBuyers(number INT) RETURNS INT 
BEGIN 
    RETURN SELECT SUM(Sum) 
     FROM (SELECT SUM(T.Quantity * S.ProductPrice) AS Sum 
       FROM Transaction T JOIN Stocks S ON T.ProductCode = S.ProductCode 
      GROUP BY UserCode ORDER BY 1 DESC LIMIT number) AS subquery; 
END++ 

DELIMITER ; 
1

您試圖返回結果集採用無界SELECT,它的功能不支持。你需要返回一個標量值。爲了從查詢中的標值,你需要把它寫成一個標量子查詢和使用RETURN語句返回其值:

DELIMITER ++ 

CREATE FUNCTION CostOfBestBuyers(number INT) RETURNS INT 
BEGIN 
    RETURN (
    SELECT SUM(Sum) 
     FROM (SELECT SUM(T.Quantity * S.ProductPrice) AS Sum 
       FROM Transaction T JOIN Stocks S ON T.ProductCode = S.ProductCode 
      GROUP BY UserCode ORDER BY 1 DESC LIMIT number) AS subquery 
); 
END++ 

DELIMITER ; 
+0

嗨!謝謝你的建議。但是我對它感到困惑,SUM(Tprice)應該返回一個標量值。但是,要獲得T價格,我將不得不調出一組行來添加它們。而行數的限制將取決於用戶輸入的參數輸入「數字」所以我想我的問題將是我的子查詢產生的結果集。我怎樣才能解決這個問題? – Champs

+0

'SELECT SUM(c1)FROM t1'返回一行和一列的結果集,這與標量值類似,但不完全相同。將它換成圓括號'(SELECT SUM(c1)FROM t1)'將其轉換爲標量子查詢,該子查詢的計算結果爲標量值。 –

+0

爲了簡化示例,如果您想從存儲函數返回當前日期/時間,可以使用'RETURN NOW();'做到這一點,但是您無法**通過SELECT NOW(); ...但你**可以**用'RETURN(SELECT NOW())'來實現;'因爲圓括號將'SELECT'中的一行一列結果轉換爲標量值。 (當然,你不會用這麼簡單的返回值做那些不必要的工作,但它是有效的,這是爲了說明原理。) –