#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