我有一张桌子,结构如下。我正在使用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。 那是我不知道如何分配和获取结果集。
请帮我解决这个问题。
答案 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>