Actualmente, salí de nuevo con doctrina, y he estado intentando durante las últimas 2 horas hacer una selección para obtener la suma de un campo específico, pero solo cuando un booleano es verdadero, y luego, otra selección para la suma de esto campo cuando el booleano es falso

Traté de hacer mi selección como:

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

Y luego también hago que otros seleccionen y se unan, pero esos no son tan importantes. El caso es que la doctrina arroja un error:

[Syntax Error] line 0, col 212: Error: Unexpected ')'

Y probé la selección con SQL nativo por consola como:

SELECT sum(case when prevision = 1 then total end)
from membre_facturation
GROUP BY id_utilisateur

Y no tener error, e incluso el resultado esperado. ¿Hay algún problema con la doctrina y la declaración del caso?

Gracias de antemano por tu ayuda. Y perdón si faltan algunas cosas, no quería escribir demasiado código, lo que habría sido "demasiado"

1
Rémi Bosgaerd 7 sep. 2018 a las 18:06

3 respuestas

La mejor respuesta

Muy bien, he estado intentando un poco más sin conexión, luego sin ver tu respuesta. Y parece que en el caso del generador de consultas, la instrucción ELSE no es opcional. Escribí mi consulta como:

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

Y en realidad está funcionando. También comprobaré la función de fusión. Quizás también funcione. O tal vez estaba haciendo algo más mal, pero la cuestión es que agregar la declaración else solucionó las cosas por mí.

¿Alguna idea de si uno es más rápido que el otro? Por lo que vi, "CASO" y "COALESCE" son bastante similares.

0
Rémi Bosgaerd 7 sep. 2018 a las 18:11

Simplemente:

SELECT coalesce(sum(m.prevision), 0) as sumOfPrevision
from membre_facturation as m
GROUP BY m.id_utilisateur

En 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();
0
Imanali Mamadiev 7 sep. 2018 a las 16:38

En lugar del caso, ¿este diseño funciona para usted?

select sum(f.total) 
from f
where f.prevision = 1
0
OwlsSleeping 7 sep. 2018 a las 15:15