2016-06-07 74 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