2015-01-05 3 views
0

Мне нужно получить процент от всех возможных значений в столбце field, в общей сложности value моей таблицы.Как правильно подготовить параметры с помощью DoctrineDBAL по следующему запросу?

Я нашел два способа, чтобы получить мой результат в SQL:

SELECT m.field, sum(m.value) * 100/t.total 
FROM my_table AS m 
    CROSS JOIN (
     SELECT SUM(value) AS total FROM 
     WHERE year = 2000) t 
WHERE m.year = 2000 
GROUP BY m.field, t.total 

И

SELECT m.field, sum(m.value) * 100/(SELECT SUM(value) AS total FROM WHERE year = 2000) 
FROM my_table AS m 
WHERE m.year = 2000 
GROUP BY m.field 

Но оба вложенные запросы, и я не знаю, как готовить statments с QueryBuilder Доктрина в в вложенные запросы.

Есть ли способ сделать это?

ответ

1

Я пытаюсь сделать это с помощью querybuilder и DQL без успеха. Как кажется, DQL не разрешает операции с подзапросами в SELECT. То, что я достиг до сих пор:

$subQuery = $em->createQueryBuilder('m') 
       ->select("SUM(m.value)") 
       ->where("m.year = 2000") 
       ->getDQL(); 

Следующий запрос работает, хотя и не вычислить процент:

$query = $em->createQueryBuilder('f') 
       ->select("f.field") 
       ->addSelect(sprintf('(%s) AS total', $subQuery)) 
       ->addSelect('(SUM(f.value)*100) AS percentage') 
       ->where("f.year = 2000") 
       ->groupBy("f.field") 
       ->getQuery() 
       ->getResult(); 

Однако, если вы пытаетесь добавить подразделение в избранных для того, чтобы получить процент и вы используете подзапрос, он просто не работает. Похоже, что в DQL это не разрешено. Я пробовал с псевдонимом и с подзапросом напрямую, и ни один из них не работал.

Не работает:

$query = $em->createQueryBuilder('f') 
        ->select("f.field") 
        ->addSelect(sprintf('(%s) AS total', $subQuery)) 
        ->addSelect('(SUM(f.value)*100)/total AS percentage') 
        ->where("f.year = 2000") 
        ->groupBy("f.field") 
        ->getQuery() 
        ->getResult(); 

Не работает либо:

$query = $em->createQueryBuilder('f') 
        ->select("f.field") 
        ->addSelect(sprintf('(SUM(f.value)*100)/(%s) AS percentage', $subQuery)) 
        ->where("f.year = 2000") 
        ->groupBy("f.field") 
        ->getQuery() 
        ->getResult(); 

Я предложил бы использовать SQL непосредственно (Учение это позволяет). Использование собственных запросов sql и сопоставление результатов могли бы сделать трюк. В этом нет недостатка.

Documentation

Если вы нашли способ сделать это с помощью QueryBuilder или DQL, пожалуйста, дайте мне знать.

Надеюсь, это поможет.