我有一张桌子,其中包含一个物品,以及我们从中购买物品的主要供应商。
Table 1
-------
item id
supplier id
我还有另一个表,其中记录了这些物品的所有购买时间。
可以从多个供应商处购买商品,因此一个商品可以在表#2中具有多个记录,这些记录具有相同的供应商ID或不同的供应商ID。
po #
item id
supplier id
date purchased
我正在尝试查找表1中每条记录的上次购买商品的时间。
这是我想出的SQL代码,但没有返回我期望的结果。
SELECT
K.item_ID,
MAX(PurchaseInfo.order_date) AS [Last Purchase Date],
PurchaseInfo.po_no
FROM
Items K
LEFT OUTER JOIN
(SELECT
order_date, supplier_id, po_no, item_id
FROM
Purchases
GROUP BY
order_date, supplier_id, po_no, item_id) AS PurchaseInfo ON PurchaseInfo.item_id = K.item_id
AND PurchaseInfo.supplier_id = K.supplier_id
GROUP BY
PurchaseInfo.order_date, K.item_id, PurchaseInfo.po_no
答案 0 :(得分:1)
一种方法是相关子查询:
select i.item_id, i.supplier_id,
(select max(pi.order_date)
from purchase_info pi
where pi.item_id = i.item_id and
pi.supplier_id = i.supplier_id
) as most_recent_order_date
from items i;
答案 1 :(得分:0)
您应该仅对K.item_id,PurchaseInfo.po_no进行分组(而不对PurchaseInfo.order_date进行分组,否则找不到max()) 如果您不使用聚集功能
,也应该使用DISTINCT而不是group bySELECT
K.item_ID,
max(PurchaseInfo.order_date) as [Last Purchase Date],
PurchaseInfo.po_no
FROM
Items K
left outer join (
select distinct order_date, supplier_id, po_no, item_id
from Purchases
) as PurchaseInfo
ON PurchaseInfo.item_id = K.item_id and PurchaseInfo.supplier_id = K.supplier_id
GROUP BY K.item_ID , PurchaseInfo.po_no
答案 2 :(得分:0)
此查询:
select
i.item_id,
max(p.order_date) [Last Purchase Date]
from items i left join purchases p
on p.item_id = i.item_id
group by i.item_id
返回每个项目的最后购买日期。
如果您还想要列po_no
,则将其加入purchases
:
select t.*, p.po_no
from (
select
i.item_id,
max(p.order_date) [Last Purchase Date]
from items i left join purchases p
on p.item_id = i.item_id
group by i.item_id
) t left join purchases p
on p.item_id = t.item_id and p.order_date = t.[Last Purchase Date]