根据MySQL中的FK和日期计算差异

时间:2015-03-17 09:31:24

标签: mysql

我正在尝试在MySQL中创建一个选择,以便使用FK(customerID)作为下面 FIRST TABLE 的参考来计算客户根据月份或日期下达的订单的差异

我想要列出的差异如下所示 customerID 84 92

FIRST TABLE

id         order_month      order_date          order      customerID
24          08              2012-08-14           24            84
58          08              2012-08-19           12            84
27          08              2012-08-12           18            84
85          09              2012-09-12           9             92
120         09              2012-09-14           14            92
124         09              2012-09-19           44            92
164         09              2012-09-20           28            92

对于customerID = 84

id         order_month      order_date          order    order_diff     customerID
24          08              2012-08-14           24          +12           84
58          08              2012-08-19           12          -6            84
27          08              2012-08-12           18          +18           84

对于customerID = 92

85          09              2012-09-12           9           -5            92
120         09              2012-09-14           14         -30            92
124         09              2012-09-19           44         -16            92
164         09              2012-09-20           28         +28            92

我正在尝试使用以下SELECT来实现上述结果:

SELECT a.id, a.order, (b.order - a.order) AS 'Difference' FROM custOrder a 
INNER JOIN custOrder b ON b.id = (a.id + 1) 
WHERE b.customerID = 84 AND b.order_month = 08  
ORDER BY b.order_date ASC 

不幸的是,select不会产生我想要获得的结果。

1 个答案:

答案 0 :(得分:1)

有几件事对我没有意义。 客户84 的记录是您所期望的,也不是您所期望的?

id         order_month      order_date          order    order_diff     customerID
24          08              2012-08-14           24          +12           84

因为我看不到你如何到达+12,当id之后的下一个订单2427并查看这些数量时,我会得到:{{1} }或24 - 18 = +6。你怎么期望获得+12?

是的,在视觉上在这两个身份18 - 24 = -6之间有一条记录,但您绝对不能依赖记录碰巧在数据库中的顺序。这完全是随意的,并且随着优化器认为合适而发生变化。

我可以给你这个查询来帮助你开始,它会选择该客户和月份的下一行,如果它找到下一条记录,则从当前一行中减去订单金额。

58

正在使用 SqlFiddle

所以我加入SELECT a.id, a.order_month, a.order_date, a.order, (a.order - ifnull(b.order, 0)) AS 'Difference', a.customerID FROM custOrder a LEFT JOIN custOrder b ON b.id = ( SELECT MIN(id) FROM custOrder WHERE id > a.id AND customerID = a.customerID AND order_month = a.order_month ) ORDER BY a.order_date ASC ,其中custOrder b最小(id),但仍然大于MIN()a.id)。这实际上给了我“next”记录。同样,>customerID也需要与order_month中的值相同。