Агрегатные функции и OrderBy

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

  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 […]


person user731060    schedule 09.11.2011    source источник
comment
Почему вы думаете, что с ним что-то не так?   -  person Aziz    schedule 09.11.2011
comment
получение такой ошибки.. ОШИБКА: столбец Registration_of_case.case_filed_by должен отображаться в предложении GROUP BY или использоваться в агрегатной функции LINE 1: SELECT case_filed_by,office_code,desg_code, court_code,court...   -  person user731060    schedule 09.11.2011
comment
Какая версия PostgreSQL? AKAIK, 9.1+ должен поддерживать это, но не более ранние версии.   -  person OMG Ponies    schedule 09.11.2011
comment
Вы используете COUNT()... поэтому вам нужно сгруппировать записи, используя GROUP BY. Проверьте w3schools.com/sql/sql_groupby.asp.   -  person Aziz    schedule 09.11.2011
comment
версия PostgreSQL8.4   -  person user731060    schedule 09.11.2011


Ответы (3)


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

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

Что-то вроде этого:

  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

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

person Frank Bollack    schedule 09.11.2011

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

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

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

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

person Niet the Dark Absol    schedule 09.11.2011

Добавьте предложение group by, подобное этому,

"группировать по case_filed_by,office_code,desg_code,court_code,court_case_no"

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

person Madhana Kumar    schedule 09.11.2011
comment
в это время количество всегда равно 1. Я хочу получить общее количество выбранных строк. - person user731060; 09.11.2011
comment
Если вы хотите, чтобы в вашем count() было общее количество строк, у вас будет одинаковый счет в каждой строке.. это нормально? И не могли бы вы объяснить свою бизнес-логику, чтобы я мог помочь вам с этим - person Madhana Kumar; 09.11.2011
comment
да .. я хочу общее количество в каждой строке. это не проблема, если одинаковое количество в каждой строке - person user731060; 09.11.2011
comment
я хочу получить этот счет для отображения в виде метки, например, общего количества найденных строк. все остальное в качестве результата поиска - person user731060; 09.11.2011