СЧЁТ, где условие СУММЫ с использованием DQL

Вопрос или проблема

Согласно базе данных членства нашего клуба, некоторые члены имеют задолженности. Есть 5 столбцов: id, номер_члена, объект, дебет и кредит. Поскольку взносы могут быть отсрочены, может быть несколько строк дебета или кредита для одного члена. Поэтому, чтобы выяснить, сколько членов имеет задолженности, я должен посчитать тех, у кого общий дебет превышает общий кредит.

Что-то вроде этого:

->select( COUNT(id) )
->where ( SUM(debits) > SUM(credits) )
->getQuery()
->getSingleScalarResult();

Конечно, я не могу использовать агрегатные функции в условии WHERE.

Я думал использовать HAVING и GROUP BY, но поскольку мне нужно посчитать и получить единственный результат, а не массив, это не сработает. Есть идеи, как это сделать с помощью DQL?

Ответ или решение

Для решения вашей задачи с использованием DQL (Doctrine Query Language) для определения количества членов клуба, которые находятся в задолженности, так как их общий дебет превышает общий кредит, вам действительно нужно воспользоваться группировкой и условием HAVING. При этом вы можете использовать подзапрос или дополнительные вычисления для подсчета нужного значения, что позволит получить одно скалярное значение.

Вот как вы можете сформулировать ваш запрос:

SELECT COUNT(m.id) 
FROM Membership m 
GROUP BY m.member_nbr 
HAVING SUM(m.debit) > SUM(m.credit)

Но поскольку вы хотите получить единичный результат (число членов в задолженности), мы можем обернуть этот запрос в другой запрос. В DQL это можно сделать с помощью подзапроса. Пример:

SELECT COUNT(*) 
FROM (
    SELECT m.member_nbr 
    FROM Membership m 
    GROUP BY m.member_nbr 
    HAVING SUM(m.debit) > SUM(m.credit)
) AS subquery

Объяснение:

  1. SUBQUERY: Внутренний запрос группирует записи по member_nbr и вычисляет суммы для debit и credit. Условие HAVING используется для фильтрации, тем самым оставляя только тех членов, у которых сумма дебетов превышает сумму кредитов.

  2. *COUNT()**: Внешний запрос подсчитывает количество уникальных членов, которые подходят под рабочие критерии.

Убедитесь, что в вашей модели Membership правильно настроены отношения и атрибуты, чтобы запрос выполнялся корректно. После этого вы можете выполнить этот DQL запрос с использованием вашего менеджера сущностей для получения результата.

Если у вас остались вопросы или есть необходимость в доработке запроса, не стесняйтесь задавать.

Оцените материал
Добавить комментарий

Капча загружается...