根据mysql中的前一行更改值

时间:2014-04-03 08:50:43

标签: mysql sql stored-procedures lag

我有一张桌子,结构如下。我正在使用phpmyadmin 3.4.5,mysql版本5.5.16。

表格

Invoice_ID - PO_ID- Product - Quantity  Invoice_Qty - Amount 
Inv1       - PO1  -  P1     -  100      - 50        - 1000      
Inv2       - PO1  -  P1     -  100      - 50        - 1000
Inv3       - PO2  -  P2     -  50       - 20        -  500
Inv4       - PO2  -  P2     -  50       - 20        -  500
Inv5       - PO2  -  P3     -  50       - 10        -  250

我真正想做的是

如果 PO_ID和产品名称的上一行是 与当前行PO_ID和产品相同,那么当前行的数量应为零?

Invoice_Quantity =数量的总和。所以要求如下

我的预期输出如下:

Out Put:
Invoice_ID - PO_ID- Product - Quantity  Invoice_Qty - Amount 
Inv1       - PO1  -  P1     -  100      - 50        - 1000      
Inv2       - PO1  -  P1     -  0        - 50        - 1000
Inv3       - PO2  -  P2     -  50       - 20        -  500
Inv4       - PO2  -  P2     -  0        - 20        -  500
Inv5       - PO2  -  P3     -  0        - 10        -  250

我尝试了How to get result set like Oracle lag function。但它对我不起作用。

并尝试为此编写程序。我坚持出口resutlset。 那是我不知道如何分配和获取结果集。

请帮我解决这个问题。

参见: http://sqlfiddle.com/#!2/5c0b0/4

3 个答案:

答案 0 :(得分:1)

你的平板电脑令人困惑。请不要在此提供样本数据,然后在sqlfiddle中使用不同的样本数据。你在这里得到的结果是错误的,因为你在描述中说了

  

如果PO_ID的上一行和产品名称与当前行PO_ID和产品相同,则当前行的数量应为零

无论如何,用过我自己的......

select
t.*,
if(@previd = po_id and @prevprod = Product, 0, Quantity) AS new_quantity,
@previd := po_id,
@prevprod := product
from
t
, (select @previd:=null, @prevprod:=null) var_init
order by po_id, product

请注意,select子句中的顺序很重要,order by子句也很重要。

答案 1 :(得分:0)

以前的ID是所有较低ID的最大ID。所以声明可以写成:

select 
  invoice_id, po_id, product,
  case when mytable.po_id = prev_mytable.po_id and mytable.product = prev_mytable.product
    then 0 
    else mytable.quantity 
  end as qty,
  invoice_qty, amount 
from mytable
left join mytable prev_mytable on prev_mytable.id = 
(
  select max(id) 
  from mytable all_prev_mytable 
  where all_prev_mytable.id < mytable.id
)
order by invoice_id;

这是SQL小提琴:http://sqlfiddle.com/#!2/5c0b0/11

这是标准SQL,因此应该适用于任何dbms。

答案 2 :(得分:0)

这可行:) :):

select Invoice_ID,PO_ID,product,
case when 
decode(lead(Quantity) over (order by PO_ID),Quantity,'SAME','DIFF') = 'SAME'
then Quantity
else 0
end Quantity, Amount 
from <table-name>