2016-06-09 130 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