2016-06-07 58 views
0

我用来通过ORM来做Django查询,但我得到的代码使用了所有的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代码中执行此操作吗?


更新

我需要真正聚集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中编写时,但获取游标并调用执行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 
); 

编辑:不知道如果我理解正确添加的问题,但如果你只是想总结一下所选择的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