我有一个表格,其结构如下。我正在使用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。所以语句可以写成:
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>