基本SQL功能

时间:2016-06-07 11:03:34

标签: sql django postgresql

我习惯通过ORM进行Django查询,但我给出的代码使用了所有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')

现在,@ C14L建议的这个SQL查询为我提供了在一个时间范围内应用于某个代理的事务总数。我需要一起添加的 source_amount 字段的总数,这些字段位于Transaction模型中,如上所示。我怎样才能做到这一点?

1 个答案:

答案 0 :(得分: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