1

我希望这不会违反任何规则(我是新手,是的,我确实检查了常见问题解答)。

但我有以下代码

SELECT DISTINCT PO_NUMBER, PO_TRACKING_NO, SUPPLIER, MIN(PO_QUANTITY),    
      SUM(SHIPPED_WT), PO_SHIPMENT_TO 
FROM VW_TRAFFIC_PO_SIDE
WHERE SYSDATE > PO_SHIPMENT_TO AND
      (PO_QUANTITY > SHIPPED_WT OR PO_TRACKING_NO IS NULL) 
GROUP BY PO_NUMBER, PO_TRACKING_NO, SUPPLIER, PO_SHIPMENT_TO
HAVING PO_QUANTITY > SUM(SHIPPED_WT)

假设执行以下操作:每个跟踪编号显示 1 个 PO#,[这是不同的,它是正确的,我能够成功编译代码]...下一步,这是棘手的部分(这是SUM、MIN、GROUP BY 和 HAVING 部分):我需要组合任何 PO_NUMBER(显示的)的 SHIPPED_WT,如果它小于 PO_Quantity,则显示该组合数字

where语句也是正确的,因为我编译成功了,只是当我添加了上面的部分时,我遇到了麻烦。

编辑:上面的代码现在编译(感谢下面的答案)

但是,我的逻辑是错误的,它没有做我希望它做的事情。它正确做的一件事是用 1 个 PO_TRACKING_NO 抓取 1 个 PO_NUMBER(只要 PO_tracking_no 不同,就可以有重复的 po_numbers,并且只要号码不同就可以有重复追踪)

编辑:下面是相关列的样子,我将解释它有什么问题(以及我试图对修改后的代码做什么

PO_NUMBER    PO_TRACKING_NO      MIN(PO_QUANTITY)  SUM(SHIPPED_WT)
123          C100                1000              750
123          C101                1000              250

该代码假设采用这样的记录,并将 SHIPPED_WT 组合成一个数字(1000),并且因为该新数字是 PO_QUANTITY 的=,所以它不应该出现在查询中......此外,PO_TRACKING_NO 的 WHERE ISNULL 不起作用(应显示该字段中具有空值的所有记录,假设它不是 PO_NUMBER 和 PO_TRACKING_NO 的重复项)

4

2 回答 2

3

您不能在 group by 子句中包含聚合值,例如 min、max、sum ......等等......

SELECT PO_NUMBER, PO_TRACKING_NO, SUPPLIER, 
MIN(PO_QUANTITY), SUM(SHIPPED_WT), PO_SHIPMENT_TO 
FROM VW_TRAFFIC_PO_SIDE WHERE SYSDATE > PO_SHIPMENT_TO 
AND (PO_QUANTITY > SHIPPED_WT OR PO_TRACKING_NO IS NULL) 
GROUP BY PO_NUMBER, PO_TRACKING_NO, SUPPLIER, PO_SHIPMENT_TO
HAVING MIN(PO_QUANTITY) > SUM(SHIPPED_WT)

参考阅读错误:ORA-00934: Group function not allowed here || 选择最高薪部门的 MIN(Salary)


编辑:添加 sqlfiddle 演示作为 OP 仍然有疑问的评论。

上面的示例演示是SQL Server因为它是我可以更接近 SQL 的最接近的示例,因为我没有看到您指定 RDBMS...因为在 MYSQL 中我们有点loose behaviou towards group_by...与 SQL Server、TSQL、Oracle 和 MS ACCESS SQL 比较. 所以上面的查询或多或少是一个ANSI标准,但你可能需要改变一些事情,比如如何将日期插入表中,GetDate()函数。

但坦率地说,您查询中的某些条件并没有真正意义。

例如 AND PO_QANTITY > SHIPPED_WT,然后你做HAVING MIN(PO_QUANTITY) > SUM(SHIPPIED_WT)......无论如何它认为你的要求;)

于 2013-01-08T12:30:21.780 回答
1

我认为您不想按 PO_TRACKING_NO 分组。此外,您的 WHERE 子句可能会意外排除您想要的行;它是您要检查的聚合(HAVING 子句)。如果使用 COALESCE 将 NULL 替换为 0,则 HAVING 子句应涵盖所有情况:

SELECT PO_NUMBER, MIN(PO_QUANTITY) AS PO_QUANTITY, SUM(COALESCE(SHIPPED_WT, 0)) AS SHIPPED_WT
FROM VW_TRAFFIC_PO_SIDE
WHERE SYSDATE > PO_SHIPMENT_TO
GROUP BY PO_NUMBER
HAVING MIN(PO_QUANTITY) > SUM(COALESCE(SHIPPED_WT, 0))
于 2013-01-08T14:29:30.053 回答