在保留业务规则的同时更新表

时间:2011-05-31 12:53:56

标签: sql

我有以下场景,业务规则和数据库架构,我想在保留业务规则的同时使用SQL更新customer和salesrep表。我可以这样做。

情形:

假设Premier Products希望提供所有客户和销售 代表圣诞节奖金。所有客户的余额都将减少 100美元,订单金额增加50美元。增加的金额 订单流向销售代表。但由于订单销售代表金额不能超过1000美元(BR4)的限制,  一些销售代表不会获得奖金。

(a)如何在纯SQL中实现这一点,同时保留所有业务规则。

BR1。客户欠款总额不得超过信用额度。

BR2。销售代表的订单金额会增加与客户相同的金额。

BR3。所有新客户都获得100美元的信贷,这是一笔初始余额 - $ 100。

BR4。销售代表无权获得超过1000美元的销售佣金。

/*-- SLSREP Table */
CREATE TABLE SLSREP
(SLSRNUMB DECIMAL(2),
TOTCOMM DECIMAL(7,2),
COMMRATE DECIMAL(3,2) CONSTRAINT CK_commrate CHECK( commrate BETWEEN 0 AND 1),
AMOUNTONORDER DECIMAL(9,2),
CONSTRAINT PK_SLSREP PRIMARY KEY (SLSRNUMB));

/*-- Customer Table */
CREATE TABLE CUSTOMER
(CUSTNUMB DECIMAL(3),
BALANCE DECIMAL(7,2) ,
CREDLIM DECIMAL(5) CONSTRAINT NN_credlim NOT NULL ,
SLSRNUMB DECIMAL(2) ,
AMOUNTONORDER DECIMAL(9,2) ,
CONSTRAINT PK_CUSTOMER PRIMARY KEY (CUSTNUMB),
CONSTRAINT FK_CUSTOMER_slsrnumb FOREIGN KEY (SLSRNUMB) REFERENCES SLSREP,
CONSTRAINT CK_credit CHECK (balance +  AMOUNTONORDER <= credlim));

1 个答案:

答案 0 :(得分:1)

这些要求似乎存在冲突。

  1. Premier Products希望全力以赴 他们的客户和销售代表a 圣诞节奖金。
  2. 但是由于a的限制 订单上的销售代表金额不能为 超过1000美元(BR4),一些销售代表 不会得到奖金。
  3. BR4。销售代表无权获得 任何超过1000美元的销售佣金 订购。
  4. 我会将奖金建模为奖金,而不是销售佣金。奖金不是佣金或订单;他们都是不同的东西。所以我提出了两个新的业务规则。

    <强> BR5。奖金不是佣金。

    <强> BR6。奖金不是订单。

    这是实现销售代表奖金表的一种方法。

    CREATE TABLE SLSREPBONUS (
       SLSRNUMB DECIMAL(2) REFERENCES SLSREP (SLSRNUMB),
       BONUSDT DATE,
       BONUSAMT DECIMAL(7,2) NOT NULL CHECK (BONUSAMT BETWEEN 1 AND 1000),
       CONSTRAINT PK_SLSREP PRIMARY KEY (SLSRNUMB, BONUSDT)
    );
    

    您的客户表只有汇总金额,所以我假设您必须在会计系统的其他部分发放贷方。我希望如果您这样做,客户聚合将得到正确更新。 (但我必须说我已经知道希望不能很好地扩展。)