2014-11-28 2 views
0

게시물 하단에 표시된대로 EXPECTED RESULT을 얻기 위해 아래 쿼리를 수정하려고합니다. 아래 질문 중 하나 또는 둘 모두를 수정하여 원하는 것을 얻을 수 있습니까?다른 where 절에 avg() 및 백분율 계산 사용

이 만 반환 피드백 기록과 AVERAGE_RATING 총 :

버전 1)

$qb = $this->createQueryBuilder('f') 
    ->select('COUNT(f.id) AS total') 
    ->addSelect('AVG(f.rating) AS average_rating') 
    ->join('f.customers', 'c') 
    ->where('c.guid = :guid') 
    ->setParameter('guid', $guid) 
    ->getQuery() 
    ->execute(); 

버전 2)

$qb = $em->createQuery(
      'SELECT 
       COUNT(f.id) AS total, 
       AVG(f.ratingSeller) AS average_rating 
       FROM 
       WhateverBundle:Feedback f 
       JOIN 
       WhateverBundle:Customer c 
       WHERE 
       c.guid = :guid' 
     ) 
      ->setParameter('guid', $guid) 
      ->getResult(); 

현재 결과 :

Array 
(
    [0] => Array 
     (
      [total] => 11 
      [average_rating] => 4 
     ) 
) 

FEEDBACKS 표

ID RATING DELIVERED CHECKED CUSTOMER_ID 
1 5  Y   Y   12 
2 4  Y   N   12 
3 4  Y   N   12 
4 5  Y   Y   12 
5 2  N   Y   12 

Customers 테이블

GUID NAME 
12  inanzzz 

예상 결과 :

total = 11 
average_rating = 4 
delivered_percentage = 80% (should take only Y in count) 
checked_percentage = 60% (should take only Y in count) 

답변

1

사용 CASE 운영자 :

버전 1 :

$qb = $this->createQueryBuilder('f') 
    ->select('COUNT(f.id) AS total') 
    ->addSelect('AVG(f.rating) AS average_rating') 
    ->addSelect('AVG(CASE WHEN f.delivered = "Y" THEN 1 ELSE 0 END) AS delivered_percentage') 
    ->addSelect('AVG(CASE WHEN f.checked = "Y" THEN 1 ELSE 0 END) AS checked_percentage') 
    ->join('f.customers', 'c') 
    ->where('c.guid = :guid') 
    ->setParameter('guid', $guid) 
    ->getQuery() 
    ->execute(); 

버전 2 : 당신은 당신의 엔티티 매핑에 적절한 type="boolean"를 사용한 경우

$qb = $em->createQuery(
      'SELECT 
       COUNT(f.id) AS total, 
       AVG(f.ratingSeller) AS average_rating 
       AVG(CASE WHEN f.delivered = "Y" THEN 1 ELSE 0 END) AS delivered_percentage 
       AVG(CASE WHEN f.checked = "Y" THEN 1 ELSE 0 END) AS checked_percentage 
       FROM 
       WhateverBundle:Feedback f 
       JOIN 
       WhateverBundle:Customer c 
       WHERE 
       c.guid = :guid' 
     ) 
      ->setParameter('guid', $guid) 
      ->getResult(); 

충분히 재미, 교리는 저장 것 YN10이므로 CASE 작업을 사용할 필요가 없습니다. setter 및 getter 함수에서 PHP truefalse을 사용할 수도 있습니다.

+0

우수. 둘 다 완벽하게 작동합니다. 네, 일부 DB 디자인 문제가 있지만 불행히도 그걸로해야합니다! – BentCoder

+0

건배! 고치기가 어렵지 않습니다. 새 열 'UPDATE table SET new_column = 1 WHERE old_column ='Y'' 등을 만든 다음 모든 것이 매핑되면 이전 열을 삭제하십시오. 그러나 코드는 마이그레이션하는 데 시간이 오래 걸릴 수 있습니다.) – sjagr

+0

'Y'와'N'에 의존하는 코드가 너무 많아서 모든 것을 망칠 까봐 두렵습니다. 또한 그것은 다른 누군가의 DB이기 때문에 나는 단지 준비 만 할 권리가 있습니다. 어쨌든, 내 문제가 해결되었습니다. 다시 한번 감사드립니다. – BentCoder