2

我正在学习 mysql (5.5) 中的存储过程,并且在这里遇到了一些关于使用 sprocs 可以做什么的心理障碍。

基础数据如下所示:

select * from fruit;

name | variety | price | quantity
---------------------------------
Pear Comice - 15 -  2
Pear Barlett - 20  - 3
Pear Anjou  - 20 - 3
Apple Red - 10 - 7 
etc

我如何获得所有类型水果的综合货币价值,比如所有梨类型?

我已经制作了这个sproc,它将获得单一品种水果的价值。

DROP PROCEDURE IF EXISTS getStockValue;

DELIMITER // CREATE PROCEDURE `getStockValue`(
IN variety varchar(20),
IN vat BOOLEAN,
OUT tot DECIMAL(8,2)
)

BEGIN
DECLARE nett_value INT;
SELECT (quantity*price) INTO nett_value from fruit where variety = variety;

IF vat = 1 THEN
SELECT (nett_value*20/100)+(nett_value) INTO tot;
ELSE
SELECT nett_value INTO tot;
END IF;
SELECT tot;

END;// DELIMITER ;

CALL getStockValue('Comice',1,@tot);

所以从我的基础数据中你可以看到,如果没有增值税,它应该返回总 150,而增值税 180。

我是否有另一个以某种方式循环结果集的存储过程?解决此问题的最佳方法是什么,以便此计算保留在数据库服务器上?这是使用游标的地方吗?

我已经阅读了很多关于何时使用/不使用存储过程的文章,但我接受了一家公司的采访,该公司警告我他们已经严重依赖它们。

编辑- 为了澄清我的整体问题。

我如何从我所在的地方得到:

CALL getStockValue('Comice',1,@tot); 
// gives 36

(事后应该重命名为 getStockValueByVariety())

到我想去的地方:

CALL getStockValueByName('Pear',1,@tot); 
// gives 180 - because it gets ALL Pear types, not just the variety Comice

最后 - twigged,我错过了一个 GROUP BY ...

SELECT SUM(price*quantity) as tot 
FROM fruit 
WHERE name = 'Pear' 
GROUP BY name;
4

1 回答 1

5

使用 CASE 语句并从存储过程中返回值。

SELECT 
    CASE vat
        WHEN 1 THEN (((quantity*price)*20/100) + (quantity * price)) 
        ELSE (quantity*price)
    END AS nett_value
FROM fruit;

如果您想要所有特定品种的总和,那么 SUM 它

SELECT 
    SUM(CASE vat
        WHEN 1 THEN (((quantity*price)*20/100) + (quantity * price)) 
        ELSE (quantity*price)
    END) AS tot
FROM fruit
WHERE variety = @variety 
GROUP BY
    name
于 2013-04-23T18:02:51.847 回答