2017-10-14 10 views
0

zurückgeben Ich versuche, eine Funktion zu erstellen, die die Summe aller meiner Top-Sales zurückgeben, aber ich bekomme diesen Fehler.Nicht erlaubt, eine Ergebnismenge von einer Funktion

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 ; 

Die SQL-Anweisung allein gibt einen einzelnen Wert, aber wenn ich die Abfrage in der Funktion gesetzt, es kommt wieder mit einem Fehler.

+1

Was ist die Fehlermeldung? –

+0

Schlechte Praxis, um Ihre Aliase die gleichen wie in SQL-Funktionsnamen, übrigens – WillardSolutions

+0

Namen zu nennen, warten, Abfrage selbst funktioniert, aber wenn Sie es in Funktion setzen, funktioniert es nicht mehr? Haben Sie stattdessen versucht, eine Prozedur zu erstellen? – wast

Antwort

0

Ich glaube, Sie fehlen nur ein 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

Sie versuchen, ein Ergebnis-Set mit einer unbegrenzten SELECT zurückzukehren, die Funktionen nicht unterstützen. Sie müssen einen Skalarwert zurückgeben. Um einen skalaren Wert aus einer Abfrage zu erhalten, müssen Sie es als eine skalare Unterabfrage schreiben und verwenden, um die RETURN Anweisung seinen Wert zurück:

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

Hallo! Danke für deinen Rat. Aber was ich darüber verwirrt bin, sollte die SUM (Tprice) einen skalaren Wert zurückgeben. Um jedoch T Preis zu erhalten, muss ich eine Spaltenmenge von Zeilen aufrufen, um sie zu addieren. Und das Limit der Anzahl der Zeilen hängt von den Parametern ab, die der Benutzer mit der Eingabe "number" eingegeben hat. Also denke ich, dass mein Problem die Ergebnismengen sein werden, die von meinen Unterabfragen erzeugt werden. Wie kann ich damit umgehen? – Champs

+0

'SELECT SUM (c1) FROM t1' gibt eine Ergebnismenge mit genau einer Zeile und einer Spalte zurück, die einem Skalarwert ähnelt, aber nicht genau dasselbe ist. Wenn Sie es in Klammern verpacken '(SELECT SUM (c1) FROM t1)' wandelt es in eine skalare Unterabfrage um, die als skalarer Wert ausgewertet wird. –

+0

Um das Beispiel zu vereinfachen, wenn Sie das aktuelle Datum/die aktuelle Uhrzeit von einer gespeicherten Funktion zurückgeben möchten, können Sie das mit 'RETURN NOW();' tun, aber ** ** nicht mit 'SELECT NOW();' ... aber Sie ** ** können es mit 'RETURN (SELECT NOW());' tun, weil die Klammern das Ergebnis der Ein-Zeilen-Eins-Spalte vom "SELECT" in einen Skalarwert umwandeln. (Sie würden diese unnötige Arbeit mit solch einem einfachen Rückgabewert natürlich nicht tun, aber es ist gültig. Dies soll das Prinzip veranschaulichen.) –

Verwandte Themen