gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 22:29:43 24 4
gpt4 key购买 nike

我下面的查询在没有 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"
有没有办法添加这些计算值列而不必更改选择中的其他 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

谢谢

更新

看起来@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

最佳答案

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

    关于sql-server - 列在选择列表中无效,因为它不包含在聚合函数或 GROUP BY 子句中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6456727/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com