我正在学习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
如何获得所有类型水果的综合货币价值,比如所有梨类型?
我得到了这种能够获得单一品种水果价值的香料。
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.
我是否有另一个以某种方式循环通过结果集的sproc? 解决此问题的最佳方法是什么,以便此计算保留在数据库服务器上? 这是否会使用游标?
我已经阅读了很多关于何时/不使用sprocs的内容,但我接受了一家公司的采访,警告我他们已经严重依赖它们了。
编辑 - 为了澄清我的整体问题。
我如何从我所在的位置获得:
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
最终 - 我已经错过了一个GROUP BY ......
SELECT SUM(price*quantity) as tot
FROM fruit
WHERE name = 'Pear'
GROUP BY name;
答案 0 :(得分:5)
使用CASE语句,只返回存储过程中的值。
SELECT
CASE vat
WHEN 1 THEN (((quantity*price)*20/100) + (quantity * price))
ELSE (quantity*price)
END AS nett_value
FROM fruit;
如果你想要所有特定品种的总和,那么SUM it
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