Оператор case конструктора запросов Doctrine вызывает непредвиденную синтаксическую ошибку

В настоящее время я ухожу с доктриной, и последние 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

и нет ни ошибки, ни даже ожидаемого результата. Что-то не так с доктриной и заявлением о регистре?

Заранее спасибо за помощь. И извините, если чего-то не хватает, я не хотел писать слишком много кода, что было бы "слишком много"

ReactJs | Supabase | Добавление данных в базу данных
ReactJs | Supabase | Добавление данных в базу данных
Это и есть ваш редактор таблиц в supabase.👇
Понимание Python и переход к SQL
Понимание Python и переход к SQL
Перед нами лабораторная работа по BloodOath:
1
0
906
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Подходит ли вам этот макет, а не чехол?

select sum(f.total) 
from f
where f.prevision = 1

Конечно, я думал об этом. Но на самом деле у меня есть 2 выбора, они будут такими: sum(case when (f.prevision = 1) then f.total end)sum(case when (f.prevision = 0) then f.total end)

Rémi Bosgaerd 07.09.2018 17:16

Подходит ли это вашему случаю: выберите сумму (f.total), f.prevision из группы f по f.prevision. Было бы проще, если бы у вас был пример набора результатов

OwlsSleeping 07.09.2018 17:49

Я не думал об этом, может, так и будет. Я тоже попробую, спасибо :)

Rémi Bosgaerd 07.09.2018 20:35

Просто:

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), что не совсем то, что я хочу. Но все равно спасибо за ответ.

Rémi Bosgaerd 10.09.2018 14:52
Ответ принят как подходящий

Хорошо, я попробовал еще немного офлайн, но не увидел вашего ответа. И похоже, что в случае построителя запросов оператор ELSE не является необязательным. Я написал свой запрос примерно так:

sum(case when (f.prevision = 1) then f.total else 0 end)

И это действительно работает. Я также проверю функцию объединения. Может и так сработает. Или, может быть, я делал что-то еще не так, но дело в том, что добавление оператора else помогло мне разобраться.

Есть идеи, что один быстрее другого? Из того, что я видел, «CASE» и «COALESCE» очень похожи.

Другие вопросы по теме