2016-06-07 4 views
0

Я использую Django-запросы через ORM, но код, который мне предоставляется, использует весь SQL.Основная функция SQL

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

cursor = connection.cursor() 
    cursor.execute(
      """ 
      SELECT a.*, COUNT(t.*) as transactions 
      FROM agent a 
      JOIN transaction t ON t.agent_id = a.id 
      WHERE t.date_created >= %s AND t.date_created < %s and t.status in %s AND a.state = %s 
      GROUP BY a.id 
      """, [startdate, enddate, config.TX_STATUSES, selectedstate]) 
    context['agents'] = util.raw_query_dict(cursor) 

Если я использую Django ORM, я использовал бы .aggregate(Sum(...)) и объединить, что агрегированные стоимость транзакций для каждого агента.

Могу ли я сделать это в коде SQL?


Update

мне нужно на самом деле агрегировать сумму определенного поля Transaction модели.

class Transaction(models.Model): 
    source_amount = MoneyField(max_digits=10, decimal_places=2, default_currency='USD') 

Прямо сейчас, это SQL-запрос, который @ C14L предложил дает мне общее количество сделок, которые относятся к конкретному агенту между временем. Мне нужна общая сумма полей source_amount, которые были добавлены вместе, которые находятся в модели Transaction, как показано выше. Как я могу это достичь?

+2

Убежать оттуда! Хорошо выполнять необработанные запросы с помощью MyModel.objects.raw(), когда один и тот же запрос трудно записать в ORM, но получение курсора и вызов execute Sheesh могут также не использовать djang вообще. В любом случае, чтобы ответить на ваш вопрос. замените это число на сумму – e4c5

ответ

0

Выберите из своего результата и суммируйте все значения transaction.

SELECT SUM(transactions) AS total FROM (
    SELECT a.*, COUNT(t.*) AS transactions 
    FROM agent a 
    JOIN transaction t ON t.agent_id = a.id 
    WHERE t.date_created >= %s 
     AND t.date_created < %s 
     AND t.status in %s 
     AND a.state = %s 
    GROUP BY a.id 
); 

Edit: Не уверен, если я правильно понял вопрос, который вы добавили, но если вы просто хотите, чтобы суммировать выбранные t.source_amount значения, то SUM() должны быть в состоянии сделать это.

SELECT SUM(t.source_amount) AS amount 
FROM agent a 
JOIN transaction t ON t.agent_id = a.id 
WHERE t.date_created >= %s 
    AND t.date_created < %s 
    AND t.status in %s 
    AND a.state = %s 
GROUP BY a.id 
+0

, не могли бы вы взглянуть на обновленный вопрос? У меня есть вопрос к моему вопросу. Не уверен, что это все еще возможно в SQL. – qarthandso

+0

Добавлен в мой ответ. – C14L

Смежные вопросы