如何获得订单数量最多的装运方式明智的供应商?

问题描述 投票:0回答:1

我很难理解何时使用子查询以及如何以有意义的方式实现它们。

我有以下表格:

桌子

supplier

供应商编号 姓名
1 供应商#0000001
2 供应商#0000002
4 供应商#0000003
3 供应商#0000004
... ...

桌子

orderitem

order_id 送货方式 供应商
1 卡车 134
2 邮件 345
3 再生空气 223
4 再生空气 11345
5 铁路 344
... ... 535

我想为每种运输方式找到出货量最高的供应商

order_items
。所以我的最终结果应该是这样的:

送货方式 供应商名称 数量
卡车 供应商#0000002 120
邮件 供应商#0003453 590
再生空气 供应商#0003456 433
空气 供应商#0000632 244
供应商#0000654 566

我想出了这个:

SELECT 
    SHIPPINGMETHOD, SUPPLIERNAME, COUNT(ORDER_ID) AS AMOUNT
FROM 
    ORDERITEM
JOIN 
    SUPPLIER L ON L.SUPPLIER_ID = ORDERITEM.SUPPLIER
GROUP BY 
    SHIPPINGMETHOD, SUPPLIERNAME;

但这只返回每种运输方式的每个供应商的运输物品数量。

然后我尝试了这个:

SELECT 
    SHIPPINGMETHOD, L.SUPPLIERNAME, COUNT(OI.ORDER_ID) AS AMOUNT
FROM 
    ORDERITEM AS OI
JOIN 
    SUPPLIER L ON L.SUPPLIER_ID = OI.SUPPLIER
GROUP BY 
    OI.SHIPPINGMETHOD, L.SUPPLIERNAME
HAVING 
    COUNT(OI.ORDER_ID) = (SELECT MAX(AMOUNT)
                          FROM 
                              (SELECT 
                                   OI2.SHIPPINGMETHOD, L2.SUPPLIERNAME, 
                                   COUNT(OI2.ORDER_ID) AS AMOUNT
                               FROM 
                                   ORDERITEM AS OI2
                               JOIN 
                                   SUPPLIER L2 ON L2.SUPPLIER_ID = OI2.SUPPLIER
                               GROUP BY 
                                   OI.SHIPPINGMETHOD, L.SUPPLIERNAME) AS SUB
);

我只得到one排回来。该行显示了其中一种方法的正确供应商和正确的装运物品数量,但我预计有 5 行。我觉得我很接近,但老实说我根本不知道我的错误到底是什么。

sql db2 greatest-n-per-group row-number
1个回答
1
投票

如果您想找到订单数量最多的运输方式明智的供应商,那么您可以试试这个:

** 这里

row_number()over()
窗口函数用于按订单数量降序排列供应商。

查询:

with cte as 
(
SELECT shippingmethod, L.name suppliername , COUNT(order_id) AS AMOUNT,
row_number()over(partition by shippingmethod, L.name order by COUNT(order_id) desc) as rn 
FROM orderitem
JOIN supplier L on L.supplier_id = orderitem.SUPPLIER
GROUP BY shippingmethod, L.name
)
select shippingmethod, suppliername , AMOUNT from cte
where rn=1

输出:

送货方式 供应商名称 金额
邮件 供应商#0000002 1
铁路 供应商#0000004 1
再生空气 供应商#0000004 1
卡车 供应商#0000001 1

小提琴

*** 如果订单数量最多的客户不止一个,所有这些客户都会在列表中。

© www.soinside.com 2019 - 2024. All rights reserved.