Ошибка SQL 42803: я не должен получать эту ошибку, что происходит? - PullRequest
0 голосов
/ 05 декабря 2018

Это мой первый пост о переполнении стека.Каждый раз, когда мне нужно что-то отсюда, кто-то другой уже задавал вопрос.Я не смог найти никаких вопросов, подобных этому, поэтому я решил написать новое сообщение.

У меня возникла небольшая проблема с запросом SQL, а код ошибки не делаетбольшой смысл для меня.Запрос выглядит следующим образом:

SELECT customer.account as "Account", customer.name as "Customer Name", sum(slpayment.payment_amount) as "Payment Amount", slpayment.reference, max(date(slpayment.payment_date)) as "Payment Date",  
CASE WHEN customer.userchk1 = '1' then 'B' else ' Y' END as type  
FROM customer  
INNER JOIN slpayment ON customer.company = slpayment.company and  
customer.account = slpayment.account  
WHERE slpayment.sales_period='11'

Этот запрос регистрирует ошибку SQL 42803: «ОШИБКА: столбец« customer.account »должен появиться в предложении GROUP BY или использоваться в статистической функции»

Я знаком с этой ошибкой, и мне удалось устранить ее по другим запросам.Однако я не понимаю, почему я получаю эту ошибку.В рассматриваемом запросе нет ни одного предложения GROUP BY нигде в функции.Я взглянул на других людей, которые задавали подобные вопросы здесь о переполнении стека, но все их запросы включали GROUP BY, и поэтому имело смысл, почему они получали ошибку.Я просто в недоумении, почему у меня проблемы здесь.

Заранее спасибо за взгляд!

Ответы [ 3 ]

0 голосов
/ 05 декабря 2018

Обязательно использовать group by cluase, если вы используете агрегатную функцию, такую ​​как sum,avg,count,min,max, в результате, хотя вы не использовали group by в своем запросе, но если вы использовали агрегатную функцию в вашем запросе, подсистема postgrey предложит вамиспользовать это в своем запросе, если у вас есть какой-либо неагрегированный столбец в выборке

Считать документы агрегированной функции

, поэтому ваш запрос будет выглядеть так:

SELECT customer.account as "Account", customer.name as "Customer Name", sum(slpayment.payment_amount) as "Payment Amount", slpayment.reference, max(date(slpayment.payment_date)) as "Payment Date",  
CASE WHEN customer.userchk1 = '1' then 'B' else ' Y' END as type  
FROM customer  
INNER JOIN slpayment ON customer.company = slpayment.company and  
customer.account = slpayment.account  
WHERE slpayment.sales_period='11'
group by customer.account,customer.name,slpayment.reference
0 голосов
/ 05 декабря 2018

Я бы предложил боковое соединение:

SELECT c.account, c.name as "Customer Name", 
       p."Payment Amount", p.reference, 
       max(date(p.payment_date)) as "Payment Date",
       (case when c.userchk1 = '1' then 'B' else ' Y' end) as type 
FROM customer c CROSS JOIN LATERAL
     (SELECT p.reference,
             sum(p.payment_amount) as "Payment Amount",
             max(date(p.payment_date)) as "Payment Date"
      FROM slpayment p
      WHERE c.company = p.company AND 
            c.account = p.account AND
            p.sales_period = '11'
     ) p;

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

0 голосов
/ 05 декабря 2018

Вам необходимо добавить предложение group by и применить все столбцы, кроме агрегированных столбцов

SELECT customer.account as "Account", customer.name as "Customer Name", sum(slpayment.payment_amount) as "Payment Amount", slpayment.reference, max(date(slpayment.payment_date)) as "Payment Date", CASE WHEN customer.userchk1 = '1' then 'B' else ' Y' END as type 
FROM customer INNER JOIN slpayment 
ON customer.company = slpayment.company and customer.account = slpayment.account 
WHERE slpayment.sales_period='11'
group by customer.account , customer.name ,slpayment.reference,customer.userchk1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...