В настоящее время я ухожу с доктриной, и последние 2 часа я пытался сделать выбор, чтобы получить сумму определенного поля, но только когда логическое значение истинно, а затем еще один выбор для суммы этого поле, когда логическое значение ложно
Я попытался сделать свой выбор следующим образом:
sum(case when (f.prevision = 1) then f.total end)
sum(case when (f.prevision = 0) then f.total end)
а потом у меня также есть другие выбирают и присоединяются, но это не так уж и важно. Дело в том, что доктрина выдает ошибку:
[Syntax Error] line 0, col 212: Error: Unexpected ')'
И я попробовал выбрать с помощью собственного SQL с помощью консоли, например:
SELECT sum(case when prevision = 1 then total end)
from membre_facturation
GROUP BY id_utilisateur
и нет ни ошибки, ни даже ожидаемого результата. Что-то не так с доктриной и заявлением о регистре?
Заранее спасибо за помощь. И извините, если чего-то не хватает, я не хотел писать слишком много кода, что было бы "слишком много"


Подходит ли вам этот макет, а не чехол?
select sum(f.total)
from f
where f.prevision = 1
Подходит ли это вашему случаю: выберите сумму (f.total), f.prevision из группы f по f.prevision. Было бы проще, если бы у вас был пример набора результатов
Я не думал об этом, может, так и будет. Я тоже попробую, спасибо :)
Просто:
SELECT coalesce(sum(m.prevision), 0) as sumOfPrevision
from membre_facturation as m
GROUP BY m.id_utilisateur
В Doctrine2:
$this->createQueryBuilder('m')
->select('coalesce(sum(m.prevision = 1), 0) as sumOfPrevision') ## for true
| OR |
->select('coalesce(sum(m.prevision = 0), 0) as sumOfPrevision') ## for false
->orderBy('m.id_utilisateur')
->getQuery()
->getResult();
И снова здравствуйте. После проверки вашего ответа с моей базой данных. Ваш запрос действительно возвращает количество строк, где m.prevision = 1 (или 0), что не совсем то, что я хочу. Но все равно спасибо за ответ.
Хорошо, я попробовал еще немного офлайн, но не увидел вашего ответа. И похоже, что в случае построителя запросов оператор ELSE не является необязательным. Я написал свой запрос примерно так:
sum(case when (f.prevision = 1) then f.total else 0 end)
И это действительно работает. Я также проверю функцию объединения. Может и так сработает. Или, может быть, я делал что-то еще не так, но дело в том, что добавление оператора else помогло мне разобраться.
Есть идеи, что один быстрее другого? Из того, что я видел, «CASE» и «COALESCE» очень похожи.
Конечно, я думал об этом. Но на самом деле у меня есть 2 выбора, они будут такими:
sum(case when (f.prevision = 1) then f.total end)sum(case when (f.prevision = 0) then f.total end)