Sql server 使用行号而不是MAX()
我的问题与此有关。我有以下查询以获取员工的母语和流利语言:Sql server 使用行号而不是MAX(),sql-server,tsql,Sql Server,Tsql,我的问题与此有关。我有以下查询以获取员工的母语和流利语言: SELECT lan.AdminFileId ,MAX(lan.MotherTongue) AS MotherTongue ,MAX(lan.Fluent) AS Fluent FROM (SELECT al.AdminFileId ,MAX(CASE WHEN al.LanguageLevelId = 4
SELECT
lan.AdminFileId
,MAX(lan.MotherTongue) AS MotherTongue
,MAX(lan.Fluent) AS Fluent
FROM (SELECT
al.AdminFileId
,MAX(CASE
WHEN al.LanguageLevelId = 4 THEN l.Label
END) AS MotherTongue
,MAX(CASE
WHEN al.LanguageLevelId = 2 THEN l.Label
END) AS Fluent
FROM AF_Language al
LEFT JOIN AF_AdminFile aaf ON aaf.AdminFileId=al.AdminFileId
INNER JOIN Employee e ON e.AdminFileId=aaf.AdminFileId
LEFT JOIN Language l ON al.LanguageId = l.ID
GROUP BY al.AdminFileId
,l.Label
,al.LanguageLevelId) AS lan
GROUP BY lan.AdminFileId
输出如下所示:
AdminFileId MotherTongue Fluent
45 English French
67 Spanish English
88 Arabic English
如何使用行数获得相同的结果?
本质上我认为您不需要使用
行编号()
,只在GROUP BY中使用AdminFileId
,子句将只有一个条目:
SELECT al.AdminFileId,
MAX(CASE WHEN al.LanguageLevelId = 4 THEN l.Label END) AS MotherTongue,
MAX(CASE WHEN al.LanguageLevelId = 2 THEN l.Label END) AS Fluent
FROM AF_Language al LEFT JOIN
AF_AdminFile aaf
ON aaf.AdminFileId = al.AdminFileId LEFT JOIN -- Used LEFT JOIN INSTEAD OF INNER
Employee e
ON e.AdminFileId = aaf.AdminFileId LEFT JOIN
Language l
ON al.LanguageId = l.ID
GROUP BY al.AdminFileId;
编辑:使用行编号
:
SELECT al.AdminFileId, l.Label,
ROW_NUMBER() OVER (PARTITION BY al.AdminFileId
ORDER BY (CASE WHEN al.LanguageLevelId = 4
THEN 1 ELSE 2
END)
) AS Seq
FROM AF_Language al LEFT JOIN
AF_AdminFile aaf
ON aaf.AdminFileId = al.AdminFileId LEFT JOIN -- Used LEFT JOIN INSTEAD OF INNER
Employee e
ON e.AdminFileId = aaf.AdminFileId LEFT JOIN
Language l
ON al.LanguageId = l.ID
WHERE al.LanguageLevelId IN (4, 2);
然后可以使用子查询:
SELECT AdminFileId,
MAX(CASE WHEN Seq = 1 THEN Label END) AS MotherTongue,
MAX(CASE WHEN Seq = 2 THEN Label END) AS Fluent
FROM ( <Query>
) t
GROUP BY AdminFileId;
选择AdminFileId,
最大值(当Seq=1时,则为标签端)作为母语,
最大值(当Seq=2时,则标记结束)为Fluent
由(
)t
按AdminFileId分组;
你到底不明白什么?网上有很多例子,不是很清楚吗?你试过什么吗?我不明白你为什么在这里有一个子查询。。。我不明白你的查询一开始是如何返回准确的结果的。查找语言文本字段的max()
似乎是一种非常奇怪的方式。这仍然很奇怪和荒谬,但至少它不再有多余的子查询。