Соберите данные, посчитайте и верните список словаря, даже если данных не существует

0

Скажем, у меня такая таблица mysql.

| id | type        | sub_type | customer    |
|  1 | animal      | cat      | John        |
|  2 | animal      | dog      | Marry       |
|  3 | animal      | fish     | Marry       |
|  3 | animal      | bird     | John        |

Я должен собирать данные по клиентам и подсчитывать строки по типу sub_type. У животного есть 4 подтипа (cat, dog, fish, bird), а у Джона есть два подтипа (cat, bird), а у Marry также два подтипа (dog, fish). Скажем, я хочу получить результат от John, Он должен выглядеть так.

[
  {name='cat', count=1},
  {name='dog', count=0},
  {name='fish', count=0},
  {name='bird', count=1}
]

Когда я хочу получить результат о Marry, он должен выглядеть так.

[
  {name='cat', count=0},
  {name='dog', count=1},
  {name='fish', count=1},
  {name='bird', count=0}
]

Таким образом, sub_type, который не находится в базе данных, должен быть возвращен с count 0. Пусть говорят, что я хочу получить результат Matthew. Поскольку нет данных Matthew, результат должен выглядеть так.

 [
  {name='cat', count=0},
  {name='dog', count=0},
  {name='fish', count=0},
  {name='bird', count=0}
]

Я обычно использовал setdefault() чтобы сделать результат. Мой код, вероятно, выглядит так.

tmp = dict()
for row in queryset:
   tmp.setdefault(row.customer, dict(cat=0, dog=0, fish=0, bird=0))
   if row.sub_type == 'cat':
      tmp[row.customer][row.sub_type] += 1

Тем не менее, я хочу знать, есть ли другой способ или более элегантный способ сделать это.

  • 0
    Вы не против использовать pandas ?
  • 1
    Вероятно, ответ зависит от типа таблицы mysql , поэтому я добавил этот тег в ваш вопрос - речь идет не об использовании универсального Python.
Показать ещё 1 комментарий
Теги:
count

1 ответ

0
Лучший ответ

Предполагая, что у вас есть таблица с именем "люди", которая содержит поле "имя", в котором есть записи

name
--------
John
Mary
Mathew

и таблица, упомянутая выше, представляет собой таблицу под названием "домашние животные",

Вы можете использовать следующий запрос для создания вашего результирующего набора для каждого человека

select
  A.name as customer,
  (select count(*) from pets where customer=A.name and sub_type='cat') as cat,
  (select count(*) from pets where customer=A.name and sub_type='dog') as dog,
  (select count(*) from pets where customer=A.name and sub_type='fish') as fish,
  (select count(*) from pets where customer=A.name and sub_type='bird') as bird
from people A

с приведенным ниже результатом

customer    cat     dog     fish    bird
John        1       0       0       1
Marry       0       1       1       0
Mathew      0       0       0       0

Добавьте дополнительное предложение where и отфильтруйте мое имя или дайте итоговый результат для всех сразу.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню