Php 表达式时与DQL和Case斗争

Php 表达式时与DQL和Case斗争,php,sql,doctrine,dql,Php,Sql,Doctrine,Dql,我正在尝试下面的查询,并且在计数方面遇到了一些问题(当r.status=2时,则为1,否则为0结束)部分 我真的需要捕捉状态的计数,它们等于“完成”。我尝试了以下操作,但始终得到:预期的条令\ORM\Query\Lexer:T\u FROM,得到' 有人能帮忙吗 $em = $this->getDoctrine()->getManager(); $query = $em->createQuery(

我正在尝试下面的查询,并且在计数方面遇到了一些问题(当r.status=2时,则为1,否则为0结束)部分

我真的需要捕捉状态的计数,它们等于“完成”。我尝试了以下操作,但始终得到:预期的条令\ORM\Query\Lexer:T\u FROM,得到'

有人能帮忙吗

$em = $this->getDoctrine()->getManager();
            $query = $em->createQuery(
                            'SELECT count(r.rpId) AS referralCount, count(CASE WHEN r.status=2 THEN 1 ELSE 0 END) as referralCompleted, p.firstName, p.lastName, p.npi, u.username
        FROM MainReferralCaptureBundle:Referral r, MainReferralCaptureBundle:Physician p, MainUserBundle:User u
        WHERE r.valid = 1 
        AND r.rpId = p.id
        AND r.submittedBy = u.id
        AND r.createdDate BETWEEN :startdate AND :enddate
        GROUP BY p.id')
                    ->setParameter('startdate', $form->get('startdate')->getData())
                    ->setParameter('enddate',  $form->get('enddate')->getData());

您没有按照
SELECT
语句中的所有非聚合字段进行分组。这不会在某些rdbms中导致错误,但会导致结果是垃圾

此外:

count(CASE WHEN r.status=2 THEN 1 ELSE 0 END)
将统计由于
ELSE 0
导致的所有记录。将
ELSE
一起删除,它将仅在满足条件时计数。同样,您可以将
ELSE 0
更改为
ELSE NULL
NULL
从聚合中排除。您还可以将
COUNT()
更改为
SUM()


这就是我从查询本身中注意到的所有内容,我不确定您得到的错误是什么。

我删除了ELSE,并使用sum而不是count。现在显示错误“'):(
SUM(r.status=2时为1,否则为0结束)
COUNT(r.status=2时为1结束)
都可以。SUM(r.status=2时为1结束)这个查询工作得很好,但我需要得到状态的计数,它们等于某个值。这就是或者写另一个不是最优的查询:(它似乎在计数中看“.”(如果r.status=2,则1结束)并打破它。当我使用sum时,它会在“.”