Неправильное использование агрегатов в SQLite - PullRequest
0 голосов
/ 26 февраля 2012

Эта ошибка возникает в этом SQLite запросе:

select f.rid, c.title, sum(some_expression) as ratio
from doesntmatter
where c.active = 1 or (ratio = 1.0 and c.active = 0
      and c.deactivated in (1, 2, 3, 4, 5)
group by f.rid

Этот вопрос решает его с помощью having условия:

select f.rid, c.title, sum(some_expression) as ratio
from doesntmatter
where c.active = 1 or (c.active = 0
      and c.deactivated in (1, 2, 3, 4, 5)
group by f.rid
having ratio = 1.0

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

1 Ответ

1 голос
/ 26 февраля 2012

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

Кроме того, вы должны добавить в группу все неагрегированные столбцы, присутствующие в операторе select, в данном случае c.id и c.title.

Трудно переписать этот запрос для вас, потому что логику немного сложно понять (из-за неправильной группировки).

Изменить:

После второй мысли вам, возможно, просто нужно исправить group by.

select c.id, c.title, sum(some_expression) as ratio
from doesntmatter
where c.active = 1 or (c.active = 0 and c.deactivated in (1, 2, 3, 4, 5))
group by c.id, c.title
having ratio = 1.0

Или, может быть:

select f.rid, sum(some_expression) as ratio
from doesntmatter
where c.active = 1 or (c.active = 0 and c.deactivated in (1, 2, 3, 4, 5))
group by f.rid
having ratio = 1.0

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

...