SQL Oracle中有两个表的分组错误
我在SQL查询方面遇到了困难。问题是:SQL Oracle中有两个表的分组错误,sql,oracle,group-by,Sql,Oracle,Group By,我在SQL查询方面遇到了困难。问题是: 对于每张发票,显示发票编号、发票日期 以及发票中购买的所有产品的总金额, 按发票号降序订购,然后按发票订购 日期按升序排列 我正在尝试使用求和函数在两个表(INVOICE和LINE)之间进行分组。以下是我到目前为止的情况: SELECT INV_NUMBER, INV_DATE, SUM(LINE_PRICE) AS TOTAL_PRICE FROM LINE, INVOICE GROUP BY INV_NUMBER ORDER BY INV_NUMBER
SELECT INV_NUMBER, INV_DATE, SUM(LINE_PRICE) AS TOTAL_PRICE
FROM LINE, INVOICE
GROUP BY INV_NUMBER
ORDER BY INV_NUMBER DESC;
INV_NUM同时位于行和发票表中。所以我也试着这么做,但运气不好:
SELECT INVOICE.INV_NUMBER, INV_DATE, SUM(LINE_PRICE) AS TOTAL_PRICE
FROM LINE, INVOICE
GROUP BY INVOICE.INV_NUMBER
ORDER BY INVOICE.INV_NUMBER DESC;
我不断听到一个错误,说:
命令行错误:1列:28
错误报告-
SQL错误:ORA-00979:不是GROUP BY表达式
97900000-“不是表达式的组”
*原因:*行动: 我做错了什么?谢谢 乔恩 如果仅禁用了“完整”组,则此选项适用于MySQL/MariaDB。否则,请使用以下选项之一:
SELECT INV_NUMBER, MIN(INV_DATE) AS INV_DATE, SUM(LINE_PRICE) AS TOTAL_PRICE
FROM LINE
JOIN INVOICE USING (INV_NUMBER)
GROUP BY INV_NUMBER
ORDER BY INV_NUMBER DESC
SELECT INV_NUMBER, INV_DATE, SUM(LINE_PRICE) AS TOTAL_PRICE
FROM LINE
JOIN INVOICE USING (INV_NUMBER)
GROUP BY INV_NUMBER, INV_DATE
ORDER BY INV_NUMBER DESC
实际上,由于表之间没有连接条件,因此将得到笛卡尔结果。接下来,GROUP BY应该是不属于任何聚合的所有列(sum、count、min、max、avg等)。因此,你必须按照朱利安建议的发票号码和日期进行分组。话虽如此,是的,发票编号应该是唯一的,并且在一个日期,因此如果按发票和额外日期字段分组,则无论明细级别的行项目如何,日期都是相同的。话虽如此。。。尝试下面的方法,我是根据join列进行猜测的,但是您可以调整它
SELECT
I.INV_NUMBER,
I.INV_DATE,
SUM(L.LINE_PRICE) AS TOTAL_PRICE
FROM
INVOICE I
JOIN LINE L
ON I.INV_NUMBER = L.INV_NUMBER
GROUP BY
I.INV_NUMBER,
I.INV_DATE
ORDER BY
I.INV_NUMBER DESC,
I.INV_DATE
答案是这样的;我的一位朋友能够提供帮助,尽管我仍然不知道为什么我所做的不起作用:
SELECT LINE.INV_NUMBER, SUM(LINE_PRICE) AS TOTAL_PRICE, INV_DATE
FROM LINE JOIN INVOICE ON (LINE.INV_NUMBER = INVOICE.INV_NUMBER)
GROUP BY LINE.INV_NUMBER, INV_DATE
ORDER BY LINE.INV_NUMBER DESC, INV_DATE ASC;
非常感谢那些曾经帮助过我的人。我真的很感激
Jon(1)使用显式
join
语法。您正在创建笛卡尔积。(2) 所有未聚合的列都需要在选择中。那么聚合的列是否可以?这本教科书没有介绍如何使用group by语句执行此操作……当我执行此操作时,我得到了相同的错误:从行交叉连接发票组中选择LINE.INV_NUMBER、INV_DATE、SUM(LINE_PRICE)。INV_NUMBERI仍然得到相同的错误,它不是一个几乎完全正确的group by表达式;我刚刚发布了一个答案,但你的答案基本正确。如果可以的话,你能解释一下为什么我的初始答案不起作用,即使我在之前将INV_日期添加到了组中?我会很感激的,谢谢@Jonathangergens,原因可能是笛卡尔的结果。在表之间没有任何连接条件的情况下,它从一个表中获取每条记录,然后连接到另一个表中的每条记录。因此,每一张唱片都会有每一个日期,只是一团糟。至少在没有看到实际数据和样本结果的情况下,这是我所怀疑的。
SELECT LINE.INV_NUMBER, SUM(LINE_PRICE) AS TOTAL_PRICE, INV_DATE
FROM LINE JOIN INVOICE ON (LINE.INV_NUMBER = INVOICE.INV_NUMBER)
GROUP BY LINE.INV_NUMBER, INV_DATE
ORDER BY LINE.INV_NUMBER DESC, INV_DATE ASC;