我有两个表,'延期交货'和'sku'
sku
id | orderdate | sku | expectedship
延期交货
orderdate | ordernum | saleschannel | sku | expectedship
在 sku 表中,是根据订单日期具有不同预期发货日期的项目列表。
例如
1 | Apple | 01.08.2014 | 19.10.2014
2 | Apple | 02.08.2014 | 28.10.2014
3 | Pear | 02.08.2014 | 20.10.2014
4 | Grape | 02.08.2014 | 22.10.2014
在延期交货表中,是已订购项目的列表。 Ordernum 是可以订购多个项目的唯一引用。
例如
02.08.2014 | order1 | a | apple
02.08.2014 | order1 | a | grape
02.08.2014 | order1 | a | pear
03.08.2014 | order2 | c | banana
我想要实现的是针对每个延期交货,为该订单的所有项目填充最长预期发货日期。
例如。
02.08.2014 | order1 | a | apple | 28.10.2014
02.08.2014 | order1 | a | grape | 28.10.2014
02.08.2014 | order1 | a | pear | 28.10.2014
03.08.2014 | order2 | c | banana | NULL
正如您在上面看到的,order1 显示了所有 3 个 sku 订购的最大/最旧日期。
下面的查询显示了每个 sku 的预计发货日期;但是无法弄清楚如何获得每个订单号的最大日期。
SELECT
backorders.orderdate,
backorders.ordernum,
backorders.saleschannel,
backorders.sku,
setup.expectedship
FROM backorders
LEFT OUTER JOIN setup ON backorders.orderdate = setup.orderdate AND backorders.sku = setup.sku
WHERE (backorders.saleschannel = 'a')
OR (backorders.saleschannel ='b')
OR (backorders.saleschannel ='c')
ORDER BY backorders.ordernum DESC
我还可以单独设法确定每个订单号的最大日期:
SELECT
backorders.ordernum,
MAX(setup.expectedship) AS `MAX(expectedship)`
FROM backorders
INNER JOIN setup ON backorders.sku = setup.sku AND backorders.orderdate = setup.orderdate
WHERE (setup.orderdate = backorders.orderdate)
AND (setup.sku = backorders.sku)
AND (backorders.saleschannel = 'a')
OR (backorders.saleschannel ='b')
OR (backorders.saleschannel ='c')
GROUP BY backorders.ordernum
有没有一种方法可以运行第一个查询来确定每个订单行的预期发货,然后运行一个子查询来将所有 ordernum 的预期发货更新为最大值?
最佳答案
关于我在评论中提到的内容,您可以将两个查询连接在一起...我会尝试复制它以确保它有效..但是您的日期格式已关闭,我没有时间格式化他们都是。
SELECT
t.orderdate, t.ordernum,
t.saleschannel, t.sku,
t1.expectedship
FROM
( SELECT
b.orderdate, b.ordernum,
b.saleschannel, b.sku,
s.expectedship
FROM backorders b
LEFT OUTER JOIN setup s ON b.orderdate = s.orderdate AND b.sku = s.sku
WHERE b.saleschannel IN('a', 'b', 'c')
ORDER BY b.ordernum DESC
)t
LEFT JOIN
( SELECT
b.ordernum,
MAX(s.expectedship) AS expectedship
FROM backorders b
INNER JOIN setup s ON b.sku = s.sku AND b.orderdate = s.orderdate
WHERE (s.sku = b.sku)
AND b.saleschannel IN('a', 'b', 'c')
GROUP BY b.ordernum
)t1 on t1.ordernum = t.ordernum
order by ordernum;
关于php - SQL 相关子查询 - MAX 所需的帮助,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25204787/