СГРУППИРОВАТЬ с помощью ДЕКОДИРОВАНИЯ в Oracle SQL (ORA-00979)

#sql #oracle #group-by #sum #decode

#sql #Oracle #группировать с помощью #сумма #декодирование

Вопрос:

Я только что прочитал много решенных вопросов относительно моей проблемы на stackoverflow и других веб-сайтах, но я все еще не понял этого. Я не могу выполнить свой прикрепленный код и получаю ошибку «ORA-00979», но я не понимаю, почему. Я прочитал, что мне не нужно перечислять предложения 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
  

Комментарии:

1. Что вы пытаетесь сделать? Агрегирование внутри DECODE выглядит для меня неправильным, особенно SUM и COUNT вместе: возможно, вам нужно сначала ДЕКОДИРОВАТЬ (т. Е. как самое внутреннее предложение), а затем агрегировать результат этого.

Ответ №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 для введения констант даты. Таким образом, буквальное значение имеет правильный тип.

Комментарии:

1. Это мне очень помогло. Большое тебе спасибо, чувак!

Ответ №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