首页 文章

带有两个表的SQL Oracle中的GROUP BY错误

提问于
浏览
-2

我在使用SQL查询时遇到了困难 . 这是一个问题:

  • 对于每张发票,显示发票中购买的所有产品的发票编号,发票日期和总金额,按发票编号按降序排列,然后按发票日期按升序排序 .

我正在尝试使用SUM函数在两个表,INVOICE和LINE之间进行GROUP BY . 这是我到目前为止:

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在LINE和INVOICE表中 . 所以我也尝试这样做,没有运气:

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表达式00979. 00000 - "not a GROUP BY expression" *原因:
*行动:

我究竟做错了什么?谢谢!

乔恩

3 回答

  • 0

    实际上你会得到笛卡尔结果,因为表之间没有连接条件 . 接下来,GROUP BY应该是所有不属于任何聚合的列(sum,count,min,max,avg等) . 因此,您必须按发票编号和Julian建议的日期进行分组 . 现在说,是的,发票编号应该是唯一的并且在一个日期,因此如果按发票和额外日期字段进行分组,则无论细节级别的行项目如何,日期都是相同的 . 这就是说...尝试以下,我猜测基于连接列,但你可以调整它

    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
    
  • 0
    SELECT INV_NUMBER, INV_DATE, SUM(LINE_PRICE) AS TOTAL_PRICE
    FROM LINE
    JOIN INVOICE USING (INV_NUMBER)
    GROUP BY INV_NUMBER
    ORDER BY INV_NUMBER DESC
    

    如果禁用ONLY_FULL_GROUP_BY,这适用于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
    
  • 0

    这是答案;我的一个朋友能够帮忙,虽然我仍然不确定为什么我在做什么不起作用:

    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;
    

    非常感谢那些试图帮助我的人 . 对此,我真的非常感激!

    乔恩

相关问题