列在选择列表中无效,因为它不包含在聚合函数或GROUP BY子句中

Pao*_*rdo 3 sql-server

我的查询在没有MAX(colName)行的情况下运行正常.原始查询选择大约100列,但现在需要添加MAX(colName)列.显然,当我添加它们时,MS SQL会抱怨错误:

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

有没有办法添加这些计算值列而不必更改select中的其他100列?下面的示例已经过简化,但原始查询更大更复杂.

                SELECT 
                     g.applicationId,
                     -- (another 100 or so columns just like above)
                    -- max(g.AScore) as AScore,
                    -- max(g.APercentile) as APercentile
                FROM application a
                LEFT JOIN GREScores g ON a.applicationId = g.applicationId
                WHERE g.applicationID = 1
Run Code Online (Sandbox Code Playgroud)

谢谢

UPDATE

看起来像@OVais提到的子查询方法就可以了.如果您认为这不是一个好方法,请告诉我原因:

                SELECT 
                     g.applicationId,
                     -- (another 100 or so columns just like above)
                    (SELECT MAX(AScore) FROM GREScores WHERE GREScores.applicationId = a.applicationId) AS tAScore
                    -- max(g.APercentile) as APercentile
                FROM application a
                LEFT JOIN GREScores g ON a.applicationId = g.applicationId
                WHERE g.applicationID = 1
Run Code Online (Sandbox Code Playgroud)

gbn*_*gbn 8

GROUP BY用于确保查询在语义上是正确的.如果您对column56有14个不同的值,那么该怎么办:SQL Server 猜测您希望输出中有14行或者崩溃到MAX?

SQL标准要求填充GROUP BY(主流RDBMS,只有MySQL没有并且猜测解决了歧义).

现在,有办法解决这个问题:

  • 从SELECT列表复制/粘贴到GROUP BY
  • 从表列节点拖动,该节点在查询编辑器中生成CSV列表

编辑:

我上面的答案是"每列100列的MAX".

如果您想要"所有行,所有行都有一个MAX",那么您可以使用窗口

        SELECT 
             g.applicationId,
             -- (another 100 or so columns just like above)
            max(g.AScore) OVER () as AScore,
            max(g.APercentile) OVER () as APercentile
        FROM GREScores g
        WHERE g.applicationID = 1
Run Code Online (Sandbox Code Playgroud)