我很难理解何时使用子查询以及如何以有意义的方式实现它们。
我有以下表格:
桌子
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 行。我觉得我很接近,但老实说我根本不知道我的错误到底是什么。
如果您想找到订单数量最多的运输方式明智的供应商,那么您可以试试这个:
** 这里
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 |
*** 如果订单数量最多的客户不止一个,所有这些客户都会在列表中。