2017-10-14 12 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 Priceを取得するには、列を追加する列を呼び出す必要があります。そして、行数の制限は、入力 "number"を持つユーザーの入力パラメータに依存するので、私の問題はサブクエリによって生成される結果セットになると思います。私はこれでどうやって乗り越えることができますか? – Champs

+0

'SELECT SUM(c1)FROM t1'は、ちょうど1つの行と1つの列を持つ結果セットを返します。これはスカラー値と似ていますが、正確には同じではありません。 '(SELECT SUM(c1)FROM t1) 'をカッコで囲むと、スカラ値として評価されるスカラ副問い合わせに変換されます。 –

+0

例を単純化するために、現在の日付/時刻をストアドファンクションから戻したい場合は、 'RETURN NOW(); 'を使用してそれを行うことができますが、** SELECT NOW();でそれを行うことはできません。 ...しかし、あなたは 'RETURN(SELECT NOW()); 'でそれを行うことができます。なぜなら、かっこが' SELECT'の1つの列結果をスカラ値に変換するからです。もちろん、このような単純な戻り値で不要な作業をすることはありませんが、これは有効です。 –

関連する問題