2017-10-14 45 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'中的一行一列结果转换为标量值。 (当然,你不会用这么简单的返回值做那些不必要的工作,但它是有效的,这是为了说明原理。) –