我正在尝试在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不会产生我想要获得的结果。
答案 0 :(得分:1)
有几件事对我没有意义。 客户84 的记录是您所期望的,也不是您所期望的?
id order_month order_date order order_diff customerID
24 08 2012-08-14 24 +12 84
因为我看不到你如何到达+12,当id
之后的下一个订单24
为27
并查看这些数量时,我会得到:{{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
中的值相同。