在SQL中使用group by子句时聚合函数错误

时间:2018-12-30 05:05:08

标签: sql sql-server sql-server-2008

我有一个名为purchase的表。它具有列billno, billdate, qty, amount。当我运行group by查询时,它抛出错误。

我使用的查询

SELECT 
    BILLNO,
    BILLDATE,
    SUM(QTY) AS SUMQTY,
    SUM(AMOUNT) AS SUMAMOUNT
FROM 
    PURCHASE
GROUP BY 
    BILLNO

这是我遇到的错误-如何获取账单总额?

  

选择列表中的“ PURCHASE.BILLDATE”列无效,因为它既不包含在聚合函数中也不在GROUP BY子句中。

3 个答案:

答案 0 :(得分:1)

错误非常明显。聚集查询的SELECT中未聚集的列需要匹配键。在您的查询中,BILLDATE未聚合,也不是键。

简单的解决方法是:

SELECT BILLNO, BILLDATE,
       SUM(QTY) AS SUMQTY,
       SUM(AMOUNT) AS SUMAMOUNT
FROM PURCHASE
GROUP BY BILLNO, BILLDATE;

如果每个BILLNO只需要一行-或者如果您知道BILLDATE对于所有BILLNO都是相同的–那么可以改用聚合函数:

SELECT BILLNO, MAX(BILLDATE) as BILLDATE,
       SUM(QTY) AS SUMQTY,
       SUM(AMOUNT) AS SUMAMOUNT
FROM PURCHASE
GROUP BY BILLNO;

答案 1 :(得分:0)

根据官方文档,‘该列必须出现在SELECT语句的FROM子句中,但不要求出现在SELECT列表中。但是,列表中任何非聚合表达式中的每个表或视图列都必须包含在GROUP BY列表中,这将指示您的错误原因。

有关更多详细信息,您可以参考此链接,您将看到有关您的问题的一些示例:https://docs.microsoft.com/en-us/sql/t-sql/queries/select-group-by-transact-sql?view=sql-server-2017#arguments

有一个很好的例子为您解释:https://www.codeproject.com/Articles/1110163/%2FArticles%2F1110163%2FSQL-GROUP-By-and-the-Column-name-is-invalid-in-the

答案 2 :(得分:0)

在这里,我们必须修改在SQL查询中使用分组依据和排序依据的概念。

请记住,排序依据中的列名称不能在汇总函数(例如SUM,Average或MAX)中使用。

因此,请勿在“聚合函数”中以及“排序依据”中输入相同的列名。