Как сделать запрос в Django, который возвращает из БД(mysql) статистику продаж с разбивкой по периодам?
Есть действующая БД(mysql), в которую собирается информация о продажах с торговых точек - одна запись - одна операция с какой-либо точки.
В таблице shops хранятся id(AUTO_INCREMENT int(11)), name(varchar(50)) и т.д (пока не интересуют) торговых точек.
В таблице sales интересующие поля - shop(varchar(3)), date_oper(datatime), summ_oper(decimal(10,2)).
Я хочу написать страницу статистики продаж в виде:
Обращаю внимание, что у 11 и 12 точке продаж в этом году не было.
Все эти данные я могу получить одним SQL запросом:
select s.shop, sh.name, ts.today_summ, sum(s.summ_oper) as month_summ, ys.year_summ
from sales s
left join shops sh # Вывожу только те магазины, в которых были продажи в этом году
on s.shop = sh.id
left join
(select shop as sh1, sum(summ_oper) as year_summ
from sales
where year(data_oper) = year(curdate())
group by shop
order by CONVERT(shop, SIGNED INTEGER)) as ys on s.shop = ys.sh1 # Привожу к int для правильной сортировки
left join
(select shop as sh2, sum(summ_oper) as today_summ
from sales
where data_oper >= curdate()
group by shop
order by CONVERT(shop, SIGNED INTEGER)) as ts on s.shop = ts.sh2
where year(data_oper) = year(curdate()) and month(data_oper) = month(curdate())
group by shop
order by CONVERT(shop, SIGNED INTEGER)
;
Подскажите, как мне получить эти данные с помощью Django-ORM для передачи в HTML шаблон?
Модели (создались через inspectdb) следующие:
class Shops(models.Model):
name = models.CharField(max_length=50)
short_name = models.CharField(max_length=20)
city = models.CharField(max_length=50)
def __str__(self):
return str(self.name)
class Meta:
managed = False
db_table = 'shops'
class Sales(models.Model):
data_oper = models.DateTimeField()
summ_oper = models.DecimalField(max_digits=10, decimal_places=2)
shop = models.CharField(max_length=3)
def __str__(self):
return str(self.id)
class Meta:
managed = False
db_table = 'sales'
ordering = ('id',)
HTML шаблон такой:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<h3>Статистика по выручке</h3>
<table width="50%" cellspacing="0" border="1">
<tr><th>Магазин</th><th>Сегодня</th><th>Этот месяц</th><th>Этот год</th></tr>
{% for r in result %}
<tr><td>{{ r.name }}</td><td>{{ r.today_summ }}</td><td>{{ r.month_summ }}</td><td>{{ r.year_summ }}</td></tr>
{% endfor %}
</table>
</body>
</html>
