SQL Correlated Subquery - MAX所需的帮助

时间:2014-08-08 13:35:43

标签: php mysql correlated-subquery

我有两张桌子,'延期交货'和'sku'

SKU

id | orderdate | sku | expectedship

缺货

orderdate | ordernum | saleschannel | sku | expectedship

在sku表中,是根据订单日期具有不同预期发货日期的项目列表。

E.g。

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是可以订购多个商品的唯一参考。

E.g。

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中的预期出货量到最大值?

1 个答案:

答案 0 :(得分:1)

我在评论中提到的你可以一起加入两个查询...我会尝试复制这个以确保它有效..但你的日期格式是关闭的我没有时间将它们全部格式化。

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;

DEMO

相关问题