2016-06-09 110 views
-2

有3个表 - 折扣(折扣)的客户端(客户端)和订单(订单)来计算折扣?

折扣

------------------------------------------------ 
|id_discount | count_orders | percent_discount | 
------------------------------------------------ 
|   1 |   5 |    1,5 | 
|   2 |   10 |    2,5 | 

客户

------------------------------------------------ 
| id_client | Name  |  Surname  | 
------------------------------------------------ 
|   1 | Ivan   | Petrov   | 
|   2 | Vasya  | Vasev   | 

订单

------------------------------------------------ 
| id   | order_sum | id_client  | 
------------------------------------------------ 

问题如何计算总金额,给定数量或客户提供的服务?如果订单总数5及以上,折扣为1.5%,如果10以上,则为2.5%。否则,没有折扣。在此先感谢

+0

您的客户表与折扣表没有任何关系。添加它。然后....非常容易,您可以计算此客户端的订单总数或订单数(例如在存储过程中)和更新表客户端。您可以在更新后的触发订单中执行此过程。你需要一个例子吗? –

+0

以同样的方式,您可以计算折扣,而无需认同'clients-> discount'。在需要时调用存储过程。 –

+0

@ValMarinov不需要提及折扣。从表格定义和问题描述可以看出,折扣取决于您订单中的物品数量。 –

回答

-1

您可以使用PROCEDURECURSOR来解决这个问题:

DELIMITER $$ 
CREATE PROCEDURE `getDiscount`(IN _orderSum INT(11)) 
    BEGIN 
    DECLARE countOrders INT(11) DEFAULT 0; 
    DECLARE percentDiscount DOUBLE DEFAULT 0; 
    DECLARE done INT(1); 
    DECLARE cur CURSOR FOR SELECT count_orders, percent_discount FROM Discount ORDER BY count_orders DESC; 
    DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1; 
    SET done = 0; 
    OPEN cur; 
    discountLoop: LOOP 
     FETCH cur INTO countOrders, percentDiscount; 
     IF done = 1 THEN LEAVE discountLoop; END IF; 
     IF _orderSum >= countOrders THEN 
      SELECT percentDiscount AS percent_discount FROM dual; 
      SET done = 1; 
     END IF; 
    END LOOP discountLoop; 
    CLOSE cur; 
    END$$ 
DELIMITER ; 
+0

您正在使用MySQL语法来回答Firebird/Interbase问题。 –

+0

对不起,我在阅读这个问题时不小心。 –

0

为此才能正常工作,你需要为0订单折扣为好。插入折扣(count_orders,percent_discount)值(0,0);

要查找客户折优惠给定ID,这样的事情:

select d.percent_discount 
from Discount d 
where d.count_orders = isnull(
     (select max(count_orders) 
     from Discount dI where count_orders <= (
      select count(1) from Orders oI where oI.id_client = 1)), 0) 

获取每个客户的优惠:

select c.id_client as client_id, 
     (select d.percent_discount 
     from Discount d 
     where d.count_orders = isnull(
      (select max(count_orders) 
      from Discount dI where count_orders <= (
       select count(1) from Orders oI where oI.id_client = c.id_client)), 0)) as discount 
from Clients c 

与选择相结合,发现价格每个订单折扣:

select o.id, 
c.name, 
c.surname, 
o.order_sum, 
(o.order_sum - (o.order_sum * client_discount.discount/100)) as sumWithDiscount 
from Orders o join Clients c on o.id_client = c.id_client 
    join (select cI.id_client, 
       (select d.percent_discount 
       from Discount d 
       where d.count_orders = isnull(
        (select max(count_orders) 
        from Discount dI where count_orders <= (
          select count(1) from Orders oI where oI.id_client = cI.id_client)), 0)) as discount 
      from Clients cI) as client_discount on client_discount.id_client = c.id_client