我自己正在研究这个问题,但我希望在此期间得到社区的一些意见。我有一个SQL Server 2012数据库,其中包含几个表:
折扣
Id Quantity DiscountAmount
--------------------------------
1 500 6
2 1000 8
3 1500 10
我有另一个名为Reviews
的表,其中有数千个条目。该表的架构并不重要。
我想要做的是遍历Discounts
表中的条目,并将UPDATE
语句应用于Reviews
表中该评论的行号的所有记录落在当前折扣行的数量和下一个数量-1之间。
所以在伪代码中:
For each row in the discount table order by quantity asc
BEGIN
UPDATE Review SET Discount=DiscountAmount WHERE [ROW NUMBER]
BETWEEN Quantity[CURRENT_ROW] AND Quantity[NEXT_ROW]-1
END
实际上,这会将前499行的折扣金额设置为0(这是折扣的默认值),然后对于500-999,他们获得6的折扣,对于1000-1499,他们获得8和1500的折扣+他们可以获得10折优惠。
答案 0 :(得分:2)
使用简单MAX:
<强> SqlFiddleDemo 强>
/* Preparing data */
CREATE TABLE Review(id INT IDENTITY(1,1), val INT, discount INT NULL);
INSERT INTO Review(val)
VALUES (12), (400), (600), (1100), (1550);
CREATE TABLE Discount(Id INT IDENTITY(1,1), Quantity INT, DiscountAmount INT);
INSERT INTO Discount(Quantity, DiscountAmount)
VALUES (500, 6), (1000, 8), (1500, 10);
/* Main */
UPDATE rev
SET Discount = (SELECT ISNULL(MAX(d.DiscountAmount), 0)
FROM Discount d
WHERE rev.val >= d.Quantity)
FROM Review rev;
答案 1 :(得分:1)
如果您只有4层折扣,您只需编写一个带有案例表达式的更新语句。
UPDATE Review
SET Discount = CASE
WHEN Quantity < 500 THEN 0
WHEN Quantity >= 500 AND Quantity <= 999 THEN 6
WHEN Quantity >= 1000 AND Quantity <= 1499 THEN 8
WHEN Quantity >= 1500 THEN 10
END