我需要获取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为嵌套查询准备语句。
有办法吗?
答案 0 :(得分: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();
但是,如果您尝试在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的方法,请告诉我。
希望它有所帮助。
答案 1 :(得分:0)
$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();