2013-08-07 51 views
7

是否有可能在不使用select方法的情況下在Django中重現以下mysql查詢?Django按日期和SUM值分組

MariaDB [db1]> SELECT datetime, SUM(datas) FROM table AND datetime BETWEEN '2013-07-26 13:00:00' AND '2013-07-26 23:00:00' GROUP BY datetime; 

爲了得到這種結果:

+---------------------+-----------+ 
| datetime   | SUM(data) | 
+---------------------+-----------+ 
| 2013-07-26 13:00:00 |  489 | 
| 2013-07-26 14:00:00 |  2923 | 
| 2013-07-26 15:00:00 |  984 | 
| 2013-07-26 16:00:00 |  2795 | 
| 2013-07-26 17:00:00 |  1308 | 
| 2013-07-26 18:00:00 |  1365 | 
| 2013-07-26 19:00:00 |  1331 | 
| 2013-07-26 20:00:00 |  914 | 
| 2013-07-26 21:00:00 |  919 | 
| 2013-07-26 22:00:00 |  722 | 
| 2013-07-26 23:00:00 |  731 | 
+---------------------+-----------+ 
11 rows in set (1.45 sec) 

編輯:我現在這種查詢:

>>> value = table.objects.filter(datetime__range=('2013-07-26 13:00:00', 
'2013-07-26 23:00:00')).values('datetime', 'data').annotate(Sum('data')) 

>>> print value.query 
SELECT `table`.`datetime`, `table`.`data` SUM(`table`.`imps`) AS `data__sum` 
FROM `table` 
WHERE `table`.`datetime` BETWEEN 2013-07-26 13:00:00 
and 2013-07-26 23:00:00 GROUP BY `table`.`datetime`, 
`table`.`data` ORDER BY NULL 

爲什麼總和兩個日期時間和數據操作?

我試圖在django doc上的任何地方,這裏在堆棧上,但沒有找到與我的問題相一致的東西。 有什麼建議嗎?

+1

貴查詢集生成SQL什麼?您可以使用'print values.query' –

+0

切換'.annotate()'和'.values()' –

回答

6

嗯你正在使用Count,你應該使用Sum,並values()將決定進入GROUP BY所以你應該只使用values('datetime')。您的查詢集應該是這樣的:

from django.db.models import Sum 

values = self.model.objects.filter(
    datetime__range=(self.dates[0], self.dates[1]) 
).values('datetime').annotate(data_sum=Sum('data')) 

雖然我不很確定的filter()的順序,所以它可能是這樣的:

values = self.model.objects.values('datetime').annotate(data_sum=Sum('data')).filter(
    datetime__range=(self.dates[0], self.dates[1]) 
) 

我猜你會想嘗試都然後。如果你想看到這些查詢集的原始查詢,使用Queryset.query

print self.model.objects.filter(
    datetime__range=(self.dates[0], self.dates[1]) 
).values('datetime').annotate(data_sum=Sum('data')).query.__str__() 

所以你可以確保你得到正確的查詢。

希望它有幫助。

+1

thx的順序,爲什麼在註釋後過濾? – tbenett

+1

這只是我不確定它們的結果查詢,所以它可以是,無論如何,使用'query .__ str __()'來檢查你需要的查詢。請仔細檢查我的答案,您應該只使用'values('datetime')' –

+0

您能編輯答案以表明哪個答案是正確的嗎? – Jglstewart

4

order_by()將讓你GROUP BY

values = self.model.objects.filter(datetime__range=(
    self.dates[0], self.dates[1])) \ 
    .values('datetime') \ 
    .annotate(data_sum=Sum('datas') \ 
    .order_by()) 
+0

不工作,抱歉:SELECT'table'.'datetime','table'.'data' FROM'table' WHERE'table'.'datetime' BETWEEN 2013-07-26 13:00:00 and 2013-07 -26 23:00:00)ORDER BY'table'.'datetime' ASC – tbenett

+0

現在怎麼樣? –

+0

這很好,我用Hieu Nguyen方法,問題來自於數值('datetime','data') – tbenett