【问题标题】:GROUP BY with DECODE in Oracle SQL (ORA-00979)在 Oracle SQL 中使用 DECODE 进行分组 (ORA-00979)
【发布时间】:2019-08-23 15:15:37
【问题描述】:

我刚刚在 stackoverflow 和其他网站上阅读了很多关于我的问题的已解决问题,但我仍然没有明白。我无法执行附加的代码,并且收到“ORA-00979”错误,但我不明白为什么。我读到我不必在我的 GROUP BY 顺序中列出 DECODE 或 COUNT 子句。我仍然得到错误。有谁知道为什么?

SELECT DISTINCT 
    company.company_id,   
    company.companyname_1,   
    customer.customer_id,   
    customer.customername_1,
    DECODE(receipt.table_name, 'PAYMENT', SUM(COUNT(receipt.receipt_id))) as inpayment
FROM 
            company
    JOIN customer ON company.company_id = customer.company_id
    JOIN debtor ON customer.customer_id = debtor.customer_id
    JOIN debtortrunk ON debtor.debtor_id = debtortrunk.debtor_id 
    JOIN receipt ON debtor.customer_id = receipt.customer_id AND debtor.deb_id = receipt.deb_id
WHERE
    receipt.created >= '24.01.2018' AND
    receipt.created <= '28.01.2018'
GROUP BY
    company.company_id,   
    company.companyname_1,   
    customer.customer_id,   
    customer.customername_1

【问题讨论】:

  • 你想做什么? DECODE 中的聚合在我看来是错误的,特别是 SUM 和 COUNT 一起:也许你需要先 DECODE(即作为最里面的子句)然后聚合结果。

标签: sql oracle group-by sum decode


【解决方案1】:

你可以用LEFT JOIN 做你想做的事,SELECT 中没有条件逻辑:

SELECT co.company_id, co.companyname_1,   
       cu.customer_id, cu.customername_1,
       COUNT(r.receipt_id) as inpayment
FROM company co JOIN
     customer cu
     ON co.company_id = cu.company_id JOIN
     debtor d
     ON cu.customer_id = d.customer_id JOIN
     debtortrunk dt
     ON d.debtor_id = dt.debtor_id LEFT JOIN
     receipt r
     ON d.customer_id = r.customer_id AND
        d.deb_id = r.deb_id AND
        r.table_name = 'PAYMENT'
WHERE r.created >= DATE '2018-01-24' AND
      r.created <= DATE '2018-01-28'
GROUP BY co.company_id, co.companyname_1,   
         cu.customer_id, cu.customername_1;

注意事项:

  • 您可能不需要debtortrunk 表。查询中似乎没有使用它。
  • 使用表别名,使查询更易于编写和阅读。
  • 使用DATE 引入日期常量。这样,字面量值就具有正确的类型。

【讨论】:

  • 这对我帮助很大。非常感谢老兄!
【解决方案2】:

你不能使用聚合函数包含另一个聚合函数。

如果我理解正确,您可以尝试使用条件聚合函数来制作。

SELECT  
    company.company_id,   
    company.companyname_1,   
    customer.customer_id,   
    customer.customername_1,
    SUM(CASE WHEN receipt.table_name = 'PAYMENT' AND receipt.receipt_id IS NOT NULL THEN 1 ELSE 0 END) as inpayment
FROM 
            company
    JOIN customer ON company.company_id = customer.company_id
    JOIN debtor ON customer.customer_id = debtor.customer_id
    JOIN debtortrunk ON debtor.debtor_id = debtortrunk.debtor_id 
    JOIN receipt ON debtor.customer_id = receipt.customer_id AND debtor.deb_id = receipt.deb_id
WHERE
    receipt.created >= '24.01.2018' AND
    receipt.created <= '28.01.2018'
GROUP BY
    company.company_id,   
    company.companyname_1,   
    customer.customer_id,   
    customer.customername_1

如果您对 group by 使用聚合函数,则 distinct 没有任何意义,因此可能会被删除。

【讨论】:

    【解决方案3】:

    ORA-00979: not a group by expression 表示在您的 SELECT 中有一些表达式不包含在组表达式中,也不涉及聚合函数。在这种情况下,它肯定是receipt.table_name 引用。

    最直接的解决方案是将其明确包含为聚合字段:

    GROUP BY
    company.company_id,   
    company.companyname_1,   
    customer.customer_id,   
    customer.customername_1,
    receipt.table_name
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-12-24
      • 2018-12-14
      • 1970-01-01
      • 1970-01-01
      • 2016-08-25
      • 2011-05-25
      • 2010-12-03
      • 2019-09-08
      相关资源
      最近更新 更多