我有以下场景,业务规则和数据库架构,我想在保留业务规则的同时使用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));
答案 0 :(得分:1)
这些要求似乎存在冲突。
我会将奖金建模为奖金,而不是销售佣金。奖金不是佣金或订单;他们都是不同的东西。所以我提出了两个新的业务规则。
<强> 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)
);
您的客户表只有汇总金额,所以我假设您必须在会计系统的其他部分发放贷方。我希望如果您这样做,客户聚合将得到正确更新。 (但我必须说我已经知道希望不能很好地扩展。)