Как сделать func.sum и group_by для вывода суммы строк и слияния дубликатов строк с помощью sqlalchemy - PullRequest
0 голосов
/ 10 мая 2019

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

Мой подзапрос:

bp = db.session.query(CustomerPurchase.book_category_id, 
func.sum(CustomerPurchase.amount).label('amount'),
func.sum(CustomerPurchase.total_price).label('total_price'))\
.filter(CustomerPurchase.created_on >= start_date)\
.filter(CustomerPurchase.created_on <= end_date)\
.group_by(CustomerPurchase.book_category_id).subquery()

Комбинированный запрос с подзапросом:

cp = CustomerPurchase.query\
.join(bp, bp.c.category_id == CustomerPurchase.category_id)\
.distinct(bp.c.category_id)\
.order_by(bp.c.category_id)

Моя таблица CustomerPurchase выглядит так, и результат моего запроса выглядит так же:

id | book_category_id | book_title | amount | total_price |
---+------------------+------------+--------+-------------+
 1 |        1         | Book A     |   10   |    35.00    |
 2 |        1         | Book A     |   20   |    70.00    |
 3 |        2         | Book B     |   40   |    45.00    |

Желаемый результат после выполнения запроса должен быть таким:

id | book_category_id | book_title | amount | total_price |
---+------------------+------------+--------+-------------+
 1 |        1         | Book A     |   30   |  105.00     |
 2 |        2         | Book B     |   40   |   45.00     |

Приведенный выше запрос отображает все книги, которые были проданы клиенту из таблицы CustomerPurchase, но он не SUM amount и total_price и не объединяет дубликат

Я видел много примеров, но ни один из них не помог мне. Любая помощь с благодарностью! Заранее спасибо!

1 Ответ

0 голосов
/ 13 мая 2019

Итак, после многих исследований и испытаний, я пришел к вопросу, который решил мою проблему. В основном я использовал атрибут add_column в sqlalchemy, который дал мне точные строки, которые я хотел отобразить для своего отчета.

bp = db.session.query(CustomerPurchase.book_store_category_id,
func.sum(CustomerPurchase.quantity).label('quantity'),
func.sum(CustomerPurchase.total_price).label('total'))\
.filter(CustomerPurchase.created_on >= start_date)\
.filter(CustomerPurchase.created_on <= end_date)

bp = bp.add_column(BookStore.book_amount)\
.filter(BookStore.category_id == CustomerPurchase.book_store_category_id)

bp = bp.add_columns(Category.category_name, Category.total_stock_amount)\
.filter(Category.id == CustomerPurchase.book_store_category_id)

bp = bp.add_column(Category.unit_cost)\
.filter(Category.id == CustomerPurchase.book_store_category_id)

bp = bp.add_column(Book.stock_amount)\
.filter(Book.category_id == CustomerPurchase.book_store_category_id)\
.group_by(BookStore.book_amount, CustomerPurchase.book_store_category_id, Category.category_name, Category.unit_cost, Category.total_stock_amount, Book.stock_amount)

bp = bp.all()
...