Мне нужно получить процент от всех возможных значений в столбце field
сравнению с общим value
моей таблицы.
Я нашел два способа получить результат в 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
Но оба являются вложенными запросами, и я не знаю, как подготовить статуты с Doctrine QueryBuilder к вложенным запросам.
Есть ли способ сделать это?
Я пытался сделать это с помощью 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();
Однако, если вы попытаетесь добавить деление в select, чтобы получить процент, и вы используете подзапрос, он просто не работает. Похоже, конструкция, которую она не допускала в 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 напрямую (это позволяет Doctrine). Использование собственных запросов sql и сопоставление результатов могли бы сделать трюк. В этом нет недостатка.
Если вы найдете способ сделать это с помощью queryBuilder или DQL, сообщите мне.
Надеюсь, поможет.
да уж! решение:
$qs = $this
->createQueryBuilder('h');
$d = $qs ->select($qs->expr()->count('h'));
$e = $d->getQuery()->getScalarResult();
$qs->addSelect('(COUNT(h.id)*100 / :t) AS percentage')->setParameter('t', $e);
$qs->addGroupBy(sprintf('h.%s', $type));
return $qs->getQuery()->getResult();