【问题标题】:Basic SQL Feature基本 SQL 功能
【发布时间】:2016-10-07 06:03:03
【问题描述】:

我习惯于通过 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 查询为我提供了在某个时间范围内适用于某个代理的事务总数。我需要将Transaction 模型中的 source_amount 字段的总量加在一起,如上图所示。我怎样才能做到这一点?

【问题讨论】:

  • 从那里跑!使用 MyModel.objects.raw() 进行原始查询很好,因为在 ORM 中很难编写相同的查询,但获取游标并调用 execute Sheesh 可能根本不使用 djang。无论如何回答你的问题。用总和替换该计数

标签: sql django postgresql


【解决方案1】:

从您的结果中选择并将所有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

【讨论】:

  • 您介意看看更新后的问题吗?我对我的问题有更新。不确定这在 SQL 中是否仍然可行。
  • 添加到我的答案中。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-05-14
  • 2020-12-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多