2015-09-27 257 views
0

現在我添加此表與這些列:更新SQL記錄

DrugID, BatchNo, ManufacreDate, ExpireDate, Quantity. 

注:(DrugID, BatchNo)構成的主鍵。

例如:有2個記錄如下:

(101, 1234, 1-7-2014, 1-7-2016, 50) 
(101, 7654, 1-7-2015, 1-7-2017, 80) 

如果作爲例子,一個客戶想從drugID = 101藥80項,我怎麼可以更新表,以便第一個記錄會被刪除,第二個將保留,但數量將被修改爲30?

請幫忙嗎?

+2

SQL表格表示*無序*集合。沒有第一行和第二行,除非列指定了排序。什麼專欄指定了排序? –

回答

0

解決這個問題的方法是計算每種藥物的累積量。然後將累計金額與期望金額進行比較以確定需要更新的行。

其餘的是一些算術。在SQL Server 2012+中,代碼如下所示:

declare @val int = 80; 

with t as (
     select t.*, 
      sum(qty) over (partition by drugid order by batchno) as cumeqty 
     from t 
    ) 
update t 
    set qty = (case when cumeqty - @val < 0 then 0 
        else cumeqty - @val 
       end) 
    where (cumeqty - @val) < qty; 

在早期版本中,您必須更加努力地獲取累積數量,但想法是相同的。

Here是一個在SQL小提琴中工作的代碼(或類似的東西)的例子。

+0

對不起,但它不起作用;( – user3361967

+0

@ user3361967 ......我也是,但你的評論,如果非常模糊,它怎麼不工作? –

+0

我試過它在SQL serevr。條件的記錄︰where(cumeqty - @ val)> qty;不會使Quantity = 0。 – user3361967