首页 > 解决方案 > SQL 使用 GROUP BY 从 3 个表中选择数据

问题描述

我正在尝试编写一个公式来从 3 个表中提取数据并努力使其正常工作。

我需要使用表 s 中的 InventoryNbr 并进行分组,因为有许多相同的 InventoryNbr,我只想返回 MAX IndexListID。IndexListID 是唯一键,所以当我在表 il 上搜索时,我应该只返回 1 行。然后我想从该行以及modelnm中提取年末,并使用这两个值来获取CarlineNm。这是我的代码:

SELECT s.InventoryNbr, MAX(s.IndexListID) AS IndexListID, il.EndYear, c.CarlineNm
FROM sysidla as s
INNER JOIN IndexList as il
ON s.IndexListID = il.IndexListID
INNER JOIN Carline as c
ON il.EndYear = c.CarlineYear
AND il.ModelNm = c.ModelNm
GROUP BY InventoryNbr
ORDER BY InventoryNbr ASC;

我不断收到的错误是:

Column 'IndexList.EndYear' is invalid in the select list because it is not contained in either an aggregate function or the GROUP BY clause.

以下是一些示例数据:

sysidla
InventoryNbr|IndexListID|Junk|Junk2
12345|1|x|y
12345|2|c|r
12345|3|c|e
12346|4|e|w

IndexList
ModelNm|Junk|Junk1|Junk3|EndYear|IndexListID
name1|c|f|r|2004|1
name2|c|f|r|2008|2
name3|c|f|r|2012|3
name4|c|f|r|2004|4
name5|c|f|r|2018|5

Carline
CarlineYear|CarlineNm|Junk9|ModelNm
2005|NAME|d|name1
2012|NAME22|d|name3
2005|NAME354|d|name4
2005|NAME1|d|name5

例如,这是一个不完整的数据样本,因为每个 IndexListID 在 IndexList 中都会有一个匹配项,但我希望能够匹配 InventoryNbr 12345 并选择最大 INDEXLISTID 为 3,然后在 IndexList 上使用 3 来获取 name3 和 2012。然后我想使用 2012 和 name3 从 Carine 获取 NAME22。

标签: sql

解决方案


在子查询中使用窗口函数:

SELECT s.InventoryNbr, s.IndexListID, il.EndYear, c.CarlineNm
FROM (SELECT s.*,
             ROW_NUMBER() OVER (PARTITION BY il.IndexListID ORDER BY il.IndexListID DESC) as seqnum
      FROM sysidla s
     ) s INNER JOIN
     IndexList il
     ON s.IndexListID = il.IndexListID INNER JOIN
     Carline c
     ON il.EndYear = c.CarlineYear AND
        il.ModelNm = c.ModelNm
WHERE seqnum = 1
ORDER BY InventoryNbr ASC;

不需要聚合。


推荐阅读