2015-08-26 63 views
1

我正在研究這個自己基於一系列從兩行的表,但我希望得到來自社會的一些輸入在其間。我有一個SQL Server 2012數據庫,就像這樣的情侶對錶:如何更新排在另一個表

折扣

Id Quantity DiscountAmount 
-------------------------------- 
1  500   6 
2  1000  8 
3  1500  10 

我有一個名爲Reviews有成千上萬個條目,在它的另一個表。該表的模式並不重要。

我想要做的就是通過在Discounts表中的項環並在這一審查的行數下降到目前的折扣行的數量和在未來量之間的Reviews表應用的UPDATE語句的所有記錄 - 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

設置http://www.sqlfiddle.com,您將得到回答更快。第二件事你爲什麼要做CURSOR就像在SQL中處理。改變思維到基於SET。 – lad2025

+0

我很好基於集合的答案,只是爲了尋找給定的問題的解決方案,無論他們採取什麼辦法。 – Scott

回答

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; 
+0

雖然這個答案很可能是正確的,有用的,最好,如果你[包括與它一起的一些解釋(http://meta.stackexchange.com/q/114762/159034)來解釋它如何幫助解決這個問題。如果存在導致其停止工作並且用戶需要了解其曾經工作的變化(可能不相關),這在未來變得特別有用。 –

+0

@jpw你看到的代碼,有> =,只是不可在撥弄。 – lad2025

+0

@jpw小提琴並不想和我合作,改變這種( – lad2025

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 
+0

這需要由我描述的用例中的另一個表驅動。上面給出的例子爲SO讀者簡化了。 – Scott

相關問題