【问题标题】:Group By expression not working in this SQL query?Group By 表达式在此 SQL 查询中不起作用?
【发布时间】:2017-04-24 21:58:06
【问题描述】:

我是 SQL 新手。谁能帮我弄清楚为什么“Group By”表达式在这个 sql 查询中不起作用?我收到此错误

ERROR at line 3:
ORA-00979: not a GROUP BY expression

我使用的代码是

CREATE OR REPLACE VIEW CUSTOMER_LINE_ITEM AS
SELECT CUSTOMER_ORDER_CART_INFO.loginName,CUSTOMER_ORDER_CART_INFO.FirstName,
CUSTOMER_ORDER_CART_INFO.LastName,CUSTOMER_ORDER_CART_INFO.orderCartID,(lineItems.orderPrice*lineItems.qtyOrdered) AS TOTAL_ORDER
FROM CUSTOMER_ORDER_CART_INFO
INNER JOIN lineItems
ON CUSTOMER_ORDER_CART_INFO.orderCartID = lineItems.orderCartID
GROUP BY CUSTOMER_ORDER_CART_INFO.loginName,CUSTOMER_ORDER_CART_INFO.FirstName,
CUSTOMER_ORDER_CART_INFO.LastName,CUSTOMER_ORDER_CART_INFO.orderCartID
ORDER BY orderCartID;

如果没有 Group By 表达式,我会生成这个视图。我认为 group by 表达式应该只删除重复项,然后给我不同订单购物车 ID 的结果。谁能帮我理解我在这里做错了什么? VIEW of CUSTOMER_LINE_ITEM without 'group by'

【问题讨论】:

  • 我建议将 TOTAL_ORDER 添加到 GROUP BY 表达式中,因为我认为此错误表明并非选择列表中的所有列也都在 group by 表达式中 - 但尚未尝试过。
  • 你试过searching吗?
  • @Aleksej。这不是一个重复的问题。我在堆栈溢出中搜索 Group by expression ,但找不到答案。解决方案也与您建议的重复问题不同。
  • 您接受的答案是“所有列都被选为按子句分组”;我链接的问题的公认答案是“您必须将 SELECT 的所有列都放在 GROUP BY 中”,这完全一样:这是一个重复的问题

标签: sql oracle


【解决方案1】:

错误信息的原因是你没有聚合(lineItems.orderPrice*lineItems.qtyOrdered)

Oracle documentation 告诉我们

SelectExpression 中带有 GROUP BY 子句的 SelectItems 必须 仅包含聚合或分组列。

这意味着您应该使用例如聚合 TOTAL_ORDER

sum(lineItems.orderPrice*lineItems.qtyOrdered)

或任何要求。

【讨论】:

  • 非常感谢.. 成功了!我明白出了什么问题。
【解决方案2】:

错误在于 group by 子句。记住简单的经验法则,所有列被选择在 group by 子句中,或者不属于 group by 子句的列被选择为某个聚合函数,如 MAX、MIN、SUM、AVG、等等

试试下面的查询,它会运行没有问题。但我不能说它的逻辑正确性,你需要根据你的需求来弄清楚。

    CREATE OR REPLACE VIEW customer_line_item AS
    SELECT cac.loginName,
           cac.FirstName,
           cac.LastName,
           cac.orderCartID,
           (SUM(li.orderPrice) * SUM(li.qtyOrdered)) AS TOTAL_ORDER
      FROM customer_order_cart_info cac
     INNER JOIN lineItems li
        ON cac.orderCartID = li.orderCartID
     GROUP BY cac.loginName,
              cac.FirstName,
              cac.LastName,
              cac.orderCartID
     ORDER BY cac.orderCartID;

现在要注意的是,li.orderPrice 和 li.qtyOrdered 被选中,但既不在 group by 也不在聚合函数中。 group by 的用法是,group by 子句中的列用于对数据进行逻辑分组。在这里,您的数据按 loginName、firstname、lastname、ordercartid 分组。但是每个组有可能存在多个 orderprice 和 qty,并且 SQL 无法证明分组逻辑的合理性。根据您的查询,我能想到的一个要求是,您想在他的购物车中找到客户的订单总价值。因此,您将 orderPrice 与 qtyOrdered 相乘。为此,您需要将每个 lineItem 的 orderPrice 和 orderqty 相乘。因此,您需要的是 (orderPrice*orderQty) 组按 lineItem 的总和(lineItemID/lineItemNo 也许,只是猜测)。对于这个,给我一些时间,让我设计一个例子,我会用它来编辑我的答案。在此之前,您可以尝试上述方法。

【讨论】:

  • 我想为时已晚。无论如何:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-14
  • 1970-01-01
  • 2012-01-25
  • 1970-01-01
  • 2015-10-13
相关资源
最近更新 更多