SQL Oracle中有两个表的分组错误

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

我在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 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;