MySQL查询 - 减去结果值

4

我需要在一个数学函数上得到一些帮助,

以下查询将每个 lot 的结果显示为2行,如下所示:

group | style | lot | section | q1 | q2 |q3  | q4  | ...

aaaaa | sssss | 123 | 111111  | 55 | 77 | 88 | 99 | ...

aaaaa | sssss | 123 | 222222  | 10 | 20 | 20 | 10 | ...

aaaaa | sssss | 321 | 111111  | 11 | 22 | 44 | 55 | ...

aaaaa | sssss | 321 | 222222  | 10 | 23 |33  | 10  | ...

每个批次的结果都有2个不同的“部分代码”(2行)
问题是:如何对列q1 q2 q3 q4 q5 ...进行两个“部分代码”的减法?
期望结果:
group | style | lot | q1 | q2 |q3 | q4  | ...

aaaaa | sssss | 123 | 45 | 57 |68 | 89 | ...

aaaaa | sssss | 321 | 1  | -1 |11 | 45 | ...

迄今为止的查询

SELECT DISTINCT gp_style_gr.code_groupe, po_lot.num_style, po_lot_sp.Num_lot,
po_lot_sp.num_secti, po_lot_se.code_secti, po_lot.terminer, po_lot.date_livraison,
po_lot_sp.qte_1, po_lot_sp.qte_2, po_lot_sp.qte_3, po_lot_sp.qte_4, po_lot_sp.qte_5,
po_lot_sp.qte_6, po_lot_sp.qte_7, po_lot_sp.qte_8, po_lot_sp.qte_9, po_lot_sp.qte_10,
po_lot_sp.qte_11, po_lot_sp.qte_12, po_lot_sp.qte_13, po_lot_sp.qte_14, po_lot_sp.qte_15,
po_lot_sp.qte_16, po_lot_sp.qte_17, po_lot_sp.qte_18, po_lot_sp.qte_19, po_lot_sp.qte_20,
po_lot_sp.qte_21, po_lot_sp.qte_22, po_lot_sp.qte_23, po_lot_sp.qte_24, po_lot_sp.qte_25,
po_lot_sp.qte_26, po_lot_sp.qte_27, po_lot_sp.qte_28, po_lot_sp.qte_29, po_lot_sp.qte_30

FROM po_lot_sp

LEFT OUTER JOIN po_lot_se ON po_lot_se.num_lot = po_lot_sp.num_lot 
and po_lot_se.num_secti = po_lot_sp.num_secti

LEFT OUTER JOIN po_lot ON po_lot.num_lot = po_lot_sp.num_lot

LEFT OUTER JOIN gp_style_gr ON gp_style_gr.num_style = po_lot.num_style

WHERE
((gp_style_gr.code_groupe = 'INSTOCK') and (po_lot.terminer = '0') 
and (po_lot_se.code_secti = '01')) or ((gp_style_gr.code_groupe = 'INSTOCK') 
and (po_lot.terminer = '0') and (po_lot_se.code_secti = '09'))

ORDER BY gp_style_gr.code_groupe, po_lot.num_style, po_lot_sp.Num_lot, 
po_lot_sp.num_secti, po_lot_se.code_secti, po_lot.terminer, po_lot.date_livraison, 

感谢您!

1
你怎么知道要从哪个部分减去? - Andrew
它始终是相同的模式,(第二行-第一行=我想要的)。 - user2981940
你的例子展示了第一行-第二行,但是无论如何,Andy Jones的解决方案是最好的(加上我的where子句修正)。 - Andrew
哎呀,你是对的。抱歉,我刚刚在屏幕前度过了最后16个小时,我想我要休息一下。 - user2981940
3个回答

2
如果章节代码遵循您的示例中的某种模式,则可以简单地将表格与自身连接。假设您的表格名称为po_lot_sp,则以下查询中,我假设第二行具有更高的章节编号。这是条件t1.section > t2.section。如果不是,请相应更改。如果章节编号没有遵循任何模式,则完全忽略此内容。
SELECT t1.`group`, t1.style, t1.lot, t1.section,
  t2.q1 - t1.q1 q1, t2.q2 - t1.q2 q2, t2.q3 - t1.q3 q3, t2.q4 - t1.q4 q4
FROM t t1
JOIN t t2 ON t1.`group` = t2.`group` AND t1.style = t2.style AND
  t1.lot = t2.lot AND t1.section > t2.section

Fiddle here.


你需要添加一个额外的where子句:"AND t1.lot = t2.lot"。 - Andrew

0

试试这个:

select a.group,a.style,a.lot, 
coalesce(a.q1 - 
(select b.q1 from  tablename b where b.ID = a.ID + 1), a.q1) as q1,  
coalesce(a.q2- 
(select b.q2 from  tablename b where b.ID = a.ID + 1), a.q2) as q2,
coalesce(a.q3- 
(select b.q3 from  tablename b where b.ID = a.ID + 1), a.q3) as q3,
coalesce(a.q4- 
(select b.q4 from  tablename b where b.ID = a.ID + 1), a.q4) as q4
from tablename a group by a.lot 

注意:这里的ID指的是您表中的主键,tablename则是您原始表格的名称。所以请将字段ID替换为您的主键字段,将表名替换为相反。

演示


0

这是我能想到的最快的方法。当然,这是假设您想从值为“111111”的部分递减:

SELECT `group`, style, lot,
  sum(if(section = '111111', q1, -q1)),
  sum(if(section = '111111', q2, -q2)),
  sum(if(section = '111111', q3, -q3)),
  sum(if(section = '111111', q4, -q4))
FROM t
GROUP BY `group`, style, lot

这里进行Fiddle。

顺便提醒一下,尽量不要使用group作为列名。它是一个保留字。

如果您不知道要从哪个部分值中减去,并且只想从最低部分减去,则可以选择Andy的解决方案。


1
我应该使用我的查询来创建一个新表,然后运行另一个查询(您发布的第一个查询正常工作)?还是我可以将其作为子查询运行? - user2981940
我可能没有理解这个问题。您可以按照您想要的方式运行它:在子查询中或者直接运行它。您不需要创建任何表格。 - Mosty Mostacho
1
好的,抱歉,我刚接触这个,只需要弄清楚如何在所有这些语法中操作就可以了...干杯 - user2981940
嗯...我差不多成功了...我从查询结果中创建了一个临时表,然后运行了你的脚本,但结果是负数...例如10-3=-13而不是10-3=7...我做错了什么吗? - user2981940

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接