3

下面的查询就像一个美女。现在我正在尝试选择PRODUCT.*导致错误代码的

42Y36: (Column reference '<value>' is invalid. For a SELECT list with a GROUP BY, the list may only contain grouping columns and valid aggregate expressions.)

接下来我尝试同时设置和SELECT导致GROUP BY错误代码PRODUCT.*

42X01: (Syntax error: <error>.)

一个普通的语法错误。好的,似乎不允许在GROUP BY. 所以我的问题是(不需要子查询),“如何在使用定义的子句时选择整个对象HAVING?”

SELECT      PRODUCT.ID
FROM        PRODUCT
LEFT JOIN   DELIVERYROW   ON  DELIVERYROW.PRODUCT_ID = PRODUCT.ID
LEFT JOIN   DISPATCHROW   ON  DISPATCHROW.PRODUCT_ID = PRODUCT.ID
WHERE       PRODUCT.DTYPE = 'PRODUCT'
GROUP BY    PRODUCT.ID
HAVING      (
                COALESCE(SUM(DELIVERYROW.AMOUNT),0) 
                - 
                COALESCE(SUM(DISPATCHROW.AMOUNT),0)
            ) > 0
4

1 回答 1

4

除非您打算对它们使用摘要功能,否则您不能在选择中包含不在 group by 中的项目。

您可以在选择中包含其他值,但您要么必须按它们分组,要么对它们执行 SUM()、AVG()、MIN()、MAX() 等...,这就是 product.* 在选择,您是说给我所有列,但仅按 product.id 分组

扩展答案以解释分组...

让我们假设产品表有四个列 | 编号 | 成本 | 姓名 | 日期 | 如果您按 id 分组,则将所有具有相同 id 的行折叠成一行,如果您希望显示其他列,则必须对它们执行聚合函数,例如我们可以按 id 分组并获取 min(date),并且max(date) 来获取每个产品 id 的最小/最大日期,我们还可以 sum(cost) 和 avg(cost) 来获取摘要和平均值。

您可以按多列分组,因此我们可以按 id 和 name 分组,为两者的每个唯一组合获取一行。您不能按 * 分组,这没有多大意义,因为它只会返回您的整个表格。

您收到的错误是由于您尝试选择不在您的分组依据中的列。

你希望输出显示什么?

于 2013-05-11T17:52:59.503 回答