根据 mysql 中的前几行更改值



我有一个表格,其结构如下。我正在使用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

我尝试了如何获取像甲骨文滞后函数这样的结果集。但它对我不起作用。

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

请帮我解决这个问题。

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

你的 sqlfiddle 令人困惑。请不要在此处提供示例数据,然后在 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
  • SQLfiddle

请注意,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小提琴:http://sqlfiddle.com/#!2/5c0b0/11。

这是标准 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> 

最新更新