GROUP BY с DECODE в Oracle SQL (ORA-00979) - PullRequest
       14

GROUP BY с DECODE в Oracle SQL (ORA-00979)

0 голосов
/ 02 апреля 2019

Я только что прочитал много решенных вопросов относительно моей проблемы на stackoverflow и других сайтах, но я все еще не получил его.Я не могу выполнить свой прикрепленный код, и я получаю ошибку «ORA-00979», но я не понимаю, почему.Я прочитал, что мне не нужно перечислять предложения DECODE или COUNT в моем заказе GROUP BY.Я все еще получаю ошибку.Кто-нибудь знает почему?

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

Ответы [ 3 ]

2 голосов
/ 02 апреля 2019

Вы можете делать то, что хотите, с 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 голосов
/ 02 апреля 2019

Вы не можете использовать агрегатную функцию, содержащую другую агрегатную функцию.

Если я правильно понимаю, вы можете попытаться использовать функцию агрегата условия, чтобы сделать это.

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, отличительные значения не имеют смысла, поэтому они могут быть удалены.

0 голосов
/ 02 апреля 2019

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
...