Как суммировать данные из аннотированного запроса - PullRequest
0 голосов
/ 01 апреля 2020

Я пытаюсь создать отчет, который показывает количество мужчин, женщин и общее количество клиентов в данный день за час.

Данные вставляются в базу данных как транзакция, когда кто-либо входит в здание. Там хранится их пол.

Запрос для сбора данных выглядит следующим образом:

initial_query = EventTransactions.objects.using('reportsdb')
                .filter(building_id=id, 
                        actualdatetime__lte=end_date, 
                        actualdatetime__gte=beg_date)

Оттуда я аннотирую запрос для извлечения даты:

ordered_query = initial_query.annotate(
            year=ExtractYear('actualdatetime'),
            month=ExtractMonth('actualdatetime'),
            day=ExtractDay('actualdatetime'),
            hour=ExtractHour('actualdatetime'),
            male=Coalesce(Sum(Case(When(customer_gender='M', then=1)), output_field=IntegerField()), Value(0)),
            female=Coalesce(Sum(Case(When(customer_gender='F', then=1)), output_field=IntegerField()), Value(0))
            ).values(
            'year', 'month', 'day', 'hour', 'male', 'female'
            )

Как я могу затем суммировать клиентов-мужчин и женщин-клиентов по часам?

Под этим я подразумеваю, что я sh предоставлю пользователю таблицу, которая содержит каждый час дня (может просто на данном этапе это число от 0 до 23), общее количество мужчин за этот час, общее количество женщин за этот час и общее количество клиентов за этот час:

TIME | MALE | FEMALE | TOTAL
0      12     4        16
1      5      8        13
2      2      3        5
3      20     38       58
etc.

Я был бы рад предоставить дополнительную информацию, если нужно. Спасибо!

1 Ответ

0 голосов
/ 01 апреля 2020

Ты почти у цели. Сделайте аннотацию для гендерных групп населения после вызова значений таким образом, чтобы база данных агрегировала группу извлеченных значений даты и времени.

ordered_query = initial_query.annotate(
                year=ExtractYear('actualdatetime'),
                month=ExtractMonth('actualdatetime'),
                day=ExtractDay('actualdatetime'),
                hour=ExtractHour('actualdatetime'),
            ).values(
                'year', 'month', 'day', 'hour',
            ).annotate(
                male=Coalesce(Sum(Case(When(customer_gender='M', then=1)), output_field=IntegerField()), Value(0)),
                female=Coalesce(Sum(Case(When(customer_gender='F', then=1)), output_field=IntegerField()), Value(0))
            )
...