Как подсчитать количество по условию?
Добрый день! К примеру, такая таблица:
Товары могут быть с одинаковыми названиями, но разными ценами. Есть поле uniq_field (название, конечно, неверное, оно не уникальное, но оно идентифицирует товар в зависимости от id и цены... Может, оно вообще не нужно :)
Как мне получить в запросе количество по каждому товару в зависимости от цены? То есть товару с таким то названием и по цене 100 руб. в наличии столько-то, а вот такой же, но по цене 200 - столько...
Я пробовал получать уникальный set с uniq_id, затем в цикле обходить всю таблицу для каждого значения set, подсчитывать количество и т.д. Но это же неправильно? Оно работает, но долго на больших таблицах. Есть ли способ лучше? Как сделать такой запрос с использованием Sum?
Спасибо!
В общем, в итоге должно получится нечто типа этого:
Рекомендуем хостинг TIMEWEB
Стабильный хостинг, на котором располагается социальная сеть EVILEG. Для проектов на Django рекомендуем VDS хостинг.Ол саған ұнайды ма? Әлеуметтік желілерде бөлісіңіз!
Пікірлер
- Ora Iro
- Жел. 24, 2024, 6:38 Т.Ж.
C++ - Тест 001. Первая программа и типы данных
- Нәтиже:40ұпай,
- Бағалау ұпайлары-8
- Akiv Doros
- Қар. 11, 2024, 2:58 Т.Қ.
C++ - Тест 004. Указатели, Массивы и Циклы
- Нәтиже:50ұпай,
- Бағалау ұпайлары-4
- molni99
- Қаз. 26, 2024, 1:37 Т.Ж.
C++ - Тест 004. Указатели, Массивы и Циклы
- Нәтиже:80ұпай,
- Бағалау ұпайлары4
Добрый день.
Да, здесь нужно средствами запросов к базе данных работать. Здесь нужно использовать annotate и values
Не уверен, что напишу полностью правильно без тестирования на кошках, но должно выглядеть как-то так
По идее, это должно взять все одинаковые значения для id товара и его цены и проссумировать столбец kol. В результате будет создан временный queryset со структурой id_tovar price count
Его уже можно будет итерировать примерно так или подобный способом
Операции annotate тоже затратные по времени, но этим будет заниматься база данных, поэтому это должно в любом случае работать быстрее
Да я так и пробую.
Вот я получаю set, тут вроде все как надо
Вывожу в консоль: все верно, нет повторяющихся значений...
Quit the server with CTRL-BREAK.
('Товар2', 50.0)
('Товар1', 200.0)
('Товар 3', 100.0)
('Товар1', 100.0)
Добавляю annotate:
Упс!
('Товар2', 50.0, 30.0)
('Товар 3', 100.0, 45.0)
('Товар1', 100.0, 20.0)
('Товар2', 50.0, 20.0)
('Товар1', 200.0, 20.0)
А я хотел бы получить
('Товар2', 50.0, 50.0)
('Товар 3', 100.0, 45.0)
('Товар1', 100.0, 20.0)
('Товар1', 200.0, 20.0)
Как можно сделать? Спасибо!
Должно работать. Покажите код моделей, ибо меня смущает эта часть values_list('title__title' , по ходу у вас там всё несколько сложнее, чем вы показали изначально
Ну title наверное неудачное название поля... Логичнее было бы id_nomenklatura или id_nom... Но у меня оно так называется..
Хорошо, тогда должно быть достаточно использовать просто внешний ключ 'title' без поиска по заголовку в записи товара.
Маловероятно, но что тогда выдаст это?
(1, 200.0, 20.0)
(3, 50.0, 20.0)
(68, 100.0, 45.0)
(3, 50.0, 30.0)
(1, 100.0, 20.0)
это потому, что у вас
а надо
values вместо values_list
большое спасибо. завтра проверю. сейчас уже нет возможности:(
А так выдает ошибку:
Ну а подумать над ошибкой? ;-)
У вас dict в set не переводится, да и не нужно это там
А я уже третий день думаю :))
Я так тоже пробовал, вот результат:
{'title__title': 'Товар 3', 'price': 100.0, 'count': 45.0}
{'title__title': 'Товар1', 'price': 100.0, 'count': 20.0}
{'title__title': 'Товар2', 'price': 50.0, 'count': 30.0}
{'title__title': 'Товар2', 'price': 50.0, 'count': 20.0}
{'title__title': 'Товар1', 'price': 200.0, 'count': 20.0}
{'title__title': 'Товар1', 'price': 100.0, 'count': 20.0}
[30/Mar/2023 13:24:33] "GET /GetActualData/ HTTP/1.1" 200 2
А надо не два вот этих:
{'title__title': 'Товар2', 'price': 50.0, 'count': 30.0}
{'title__title': 'Товар2', 'price': 50.0, 'count': 20.0}
а один:
{'title__title': 'Товар2', 'price': 50.0, 'count': 50.0}
Вообще мне это нужно вот для чего - эти данные потом будут передаваться в option селекта и оператор при выборе будет видеть, сколько у него осталось товара по такой-то цене... Чтобы лишнего не отпустил:). Да и вообще для отчетов потом нужно... Вот и хочу такой хитрый запрос сделать. Я бы плюнул, создал бы временную таблицу, и записывал бы туда остатки. Циклом опять же... Но вот интересно, можно ли в принципе такой запрос сделать. Вроде как на Postgress есть distinct по определенному полю, но у меня sqlite :(
Может, есть все таки идеи, как это можно?
Спасибо!
То есть у вас SQLite? А я думаю, почему это не работает.
Возможно проблема в отсутствии сортировки результатов. Попробуйте так
Да! Вот так работает! Огромное Вам спасибо!
........