sql - 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。
解决方案
在子查询中使用窗口函数:
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;
不需要聚合。
推荐阅读
- android - 如何使用 Gradle 更改 App Bundle 的生成文件名?
- html - SVG文件被重新下载了很多
- javascript - React 重用在整个组件中获取 JSON 数据
- c++ - C ++如何防止程序在收到char而不是int时无休止地重复输入?
- python - 使用 Roipoly 进行图像分析。获取 ValueError
- javascript - 图表上只有一个带有 chart.js 时自动居中刻度和值
- java - 电子邮件验证错误
- google-docs - 如何在电子表格中捕获通过助手进行的语音输入?
- spring-mvc - Spring thymeleaf Form url 无法解析
- dictionary - UWP 地图更新性能