我得到:“你试图执行一个不包含指定表达式'OrdID'的查询作为聚合函数的一部分。我如何绕过?

时间:2013-03-29 20:14:09

标签: sql ms-access ms-access-2010 aggregate-functions

我的代码如下:

SELECT Last, OrderLine.OrdID, OrdDate, SUM(Price*Qty)  AS total_price
    FROM ((Cus INNER JOIN Orders ON Cus.CID=Orders.CID)
        INNER JOIN OrderLine
            ON Orders.OrdID=OrderLine.OrdID)
        INNER JOIN ProdFabric
            ON OrderLine.PrID=ProdFabric.PrID   
            AND OrderLine.Fabric=ProdFabric.Fabric  
    GROUP BY Last  
    ORDER BY Last DESC, OrderLine.OrdID DESC;  

此代码之前已经得到了回答,但含糊不清。我想知道我哪里出错了。

  

您尝试执行的查询不包含指定表达式'OrdID'作为聚合函数的一部分。

我不断收到错误消息,无论我改变什么,它都会给我这个错误。是的我知道,它是用SQL-92编写的,但是我如何使它成为一个合法的功能呢?

2 个答案:

答案 0 :(得分:10)

对于几乎每个DBMS(MySQL是我所知道的唯一例外,但也可能有其他例外),SELECT中未聚合的每一列都需要在GROUP BY子句中。对于您的查询,除了SUM()

中的列之外,这将是一切
SELECT Last, OrderLine.OrdID, OrdDate, SUM(Price*Qty)  AS total_price
...   
GROUP BY Last, OrderLine.OrdID, OrdDate  
ORDER BY Last DESC, OrderLine.OrdID DESC;  

答案 1 :(得分:2)

如果您 要保持GROUP BY完好无损(并且将非聚合字段添加到列表中),那么您需要确定哪些值需要OrderLine.OrdIDOrdDate。例如,您可以选择MAXMIN这些值。

所以它是 bernie 建议的GROUP BY Last, OrderLine.OrdID, OrdDate或类似的东西(如果它对您的业务逻辑有意义):

SELECT Last, MAX(OrderLine.OrdID), MAX(OrdDate), SUM(Price*Qty) AS total_price