基于mysql中的前几行更改值

基于mysql中的前几行更改值,mysql,sql,stored-procedures,lag,Mysql,Sql,Stored Procedures,Lag,我有一张桌子,它的结构如下。我使用的是phpMyAdmin3.4.5,mysql版本5.5.16 桌子 我真正想做的是 如果采购订单ID和产品名称的前一行为 与当前行采购订单ID和产品相同,那么当前行的数量应为零 发票数量之和=数量。如下图所示 我的预期产出如下: Out Put: Invoice_ID - PO_ID- Product - Quantity Invoice_Qty - Amount Inv1 - PO1 - P1 - 100 - 50

我有一张桌子,它的结构如下。我使用的是phpMyAdmin3.4.5,mysql版本5.5.16

桌子

我真正想做的是

如果采购订单ID和产品名称的前一行为 与当前行采购订单ID和产品相同,那么当前行的数量应为零

发票数量之和=数量。如下图所示

我的预期产出如下:

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
我试过了。但这对我不起作用

并试图为此编写一个程序。我被导出结果集卡住了。 也就是说,我不知道如何分配和获取结果集

请帮我解决这个问题

参考:
你的sqlfiddle让人困惑。请不要在这里提供样本数据,然后在SQLFIDLE中使用不同的样本数据。你想要的结果是错误的,因为你在描述中说

若采购订单标识和产品名称的前一行与当前行采购订单标识和产品相同,则当前行的数量应为零

不管怎样,用我自己的

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子句都很重要。

上一个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提琴:

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

这适用于:

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> 

为什么?你为什么要这么做!?!?!在这个表中,我有另一列“发票数量”。根据采购订单ID,发票数量的总和等于上述数量。因此,我需要更改重复的采购订单ID和产品数量=0。我不明白,但这听起来像是一条重要的信息!考虑相应地修改你的问题!@草莓请看我更新的表格结构。你可以理解。为什么我需要这个。你可以使用Lead,它是一个分析函数,用于比较前一行数据和当前行数据。同样,这个问题是针对MySQL的,而不是Oracle或其他什么。没有领先,就没有落后!
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>