我是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表达式,我会生成此视图。我认为按表达式分组应该只删除重复项,然后只使用不同的订单购物车ID给我结果。谁能帮助我理解我在这里做错了什么? VIEW of CUSTOMER_LINE_ITEM without 'group by'
答案 0 :(得分:1)
错误消息的原因是您没有汇总(lineItems.orderPrice*lineItems.qtyOrdered)
。
Oracle documentation告诉我们
SelectExpression中的SelectItems必须包含GROUP BY子句 仅包含聚合或分组列。
这意味着您应该使用例如
来聚合TOTAL_ORDERsum(lineItems.orderPrice*lineItems.qtyOrdered)
或无论要求是什么。
答案 1 :(得分:1)
错误在于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子句中的列用于对数据进行逻辑分组。这里您的数据按loginName,firstname,lastname,ordercartid分组。但是每个组存在多个orderprice和qty的可能性,然后SQL无法证明分组逻辑的合理性。根据您的查询,我能想到的一个要求是,您希望在购物车中找到客户订单的总价值。因此,您将orderPrice与qtyOrdered相乘。要实现这一点,您需要将每个lineItem的orderPrice和orderqty相乘。因此,你需要的是lineItem的(orderPrice * orderQty)组的总和(lineItemID / lineItemNo可能只是一个猜测)。对于这个,给我一些时间,让我设计一个例子,我将用它编辑我的答案。直到那时你尝试上面的东西。