Агрегатные функции и OrderBy - PullRequest
1 голос
/ 09 ноября 2011

У меня есть запрос, подобный следующему:

  SELECT case_filed_by,
         office_code,
         desg_code, 
         court_code,
         court_case_no,
         COUNT(office_code) as count 
    FROM registration_of_case 
   WHERE TRUE 
     AND SUBSTR(office_code, 1, 0) = SUBSTR('', 1, 0) 
ORDER BY court_code, court_case_no

Я получаю следующую ошибку:

ОШИБКА: столбец "registration_of_case.case_filed_by" должен появиться в GROUPПредложение BY или использоваться в агрегатной функции LINE 1: SELECT case_filed_by, office_code, desg_code, court_code, court […]

Ответы [ 3 ]

2 голосов
/ 09 ноября 2011

Как вы описываете в своих комментариях, вы на самом деле хотите количество выбранных строк в отдельном поле вашего набора результатов.

Этого можно добиться, используя подвыбор подсчета и объединяя эти два запроса.

Примерно так:

  SELECT case_filed_by,
         office_code,
         desg_code, 
         court_code,
         court_case_no,
         office_code_count 
    FROM registration_of_case,
         (SELECT COUNT(office_code) AS office_code_count 
            FROM registration_of_case 
           WHERE TRUE 
             AND SUBSTR(office_code, 1, 0) = SUBSTR('', 1, 0)
         ) AS count_query
   WHERE TRUE 
     AND SUBSTR(office_code, 1, 0) = SUBSTR('', 1, 0) 
ORDER BY court_code, court_case_no

Я не смог проверить запрос, но он должен сработать или, по крайней мере, указать вам правильное направление.

1 голос
/ 09 ноября 2011

Вы используете COUNT(), который является агрегатной функцией, вместе с рядом полей, которые не являются частью GROUP BY (поскольку их нет) или в статистической функции (кроме office_code).

Теперь в MySQL разрешено что-то подобное, потому что движок выберет одну запись из группы и вернет ее (хотя запрос никак не может повлиять на это, обычно это нормально).Postgresql явно не может.Я не использую Postgresql и могу разобраться.

Если Postgresql имеет «нестрогий» режим, я предлагаю вам включить его;в противном случае либо исправьте свой запрос, либо измените типы базы данных.

Я бы предложил соответствующий запрос, если бы знал, что Postgresql делает, а что нет, разрешать.

0 голосов
/ 09 ноября 2011

Добавьте предложение group by следующим образом:

"group by case_filed_by, office_code, desg_code, court_code, court_case_no"

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

...