Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 使用行号而不是MAX()_Sql Server_Tsql - Fatal编程技术网

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()
似乎是一种非常奇怪的方式。这仍然很奇怪和荒谬,但至少它不再有多余的子查询。