Функция func.sum
Функция func.sum относится к семейству
агрегатных функций и вычисляет сумму значений
указанной колонки. В качестве параметра функция
принимает колонку или выражение, значения
которого нужно сложить. Обычно применяется
вместе с методами группировки group_by
и фильтрации having.
Синтаксис
func.sum(column)
Пример
Давайте создадим таблицу статей и посчитаем
сумму значений колонки num:
from sqlalchemy import create_engine, MetaData, Table, Column, Integer, String, select, func
engine = create_engine('sqlite:///:memory:')
metadata = MetaData()
articles = Table(
'articles', metadata,
Column('id', Integer, primary_key=True),
Column('title', String),
Column('status', String),
Column('num', Integer)
)
metadata.create_all(engine)
with engine.connect() as conn:
conn.execute(articles.insert(), [
{'title': 'article 1', 'status': 'published', 'num': 10},
{'title': 'article 2', 'status': 'published', 'num': 20},
{'title': 'article 3', 'status': 'draft', 'num': 30}
])
conn.commit()
stmt = select(func.sum(articles.c.num))
res = conn.execute(stmt).scalar()
print(res)
Результат выполнения кода:
60
Пример
Давайте выведем сумму значений колонки
num с псевдонимом через метод label:
from sqlalchemy import create_engine, MetaData, Table, Column, Integer, String, select, func
engine = create_engine('sqlite:///:memory:')
metadata = MetaData()
articles = Table(
'articles', metadata,
Column('id', Integer, primary_key=True),
Column('title', String),
Column('status', String),
Column('num', Integer)
)
metadata.create_all(engine)
with engine.connect() as conn:
conn.execute(articles.insert(), [
{'title': 'article 1', 'status': 'published', 'num': 10},
{'title': 'article 2', 'status': 'published', 'num': 20},
{'title': 'article 3', 'status': 'draft', 'num': 30}
])
conn.commit()
stmt = select(func.sum(articles.c.num).label('total'))
res = conn.execute(stmt).first()
print(res.total)
Результат выполнения кода:
60
Пример
Давайте посчитаем сумму значений колонки
num для каждой группы по колонке
status:
from sqlalchemy import create_engine, MetaData, Table, Column, Integer, String, select, func
engine = create_engine('sqlite:///:memory:')
metadata = MetaData()
articles = Table(
'articles', metadata,
Column('id', Integer, primary_key=True),
Column('title', String),
Column('status', String),
Column('num', Integer)
)
metadata.create_all(engine)
with engine.connect() as conn:
conn.execute(articles.insert(), [
{'title': 'article 1', 'status': 'published', 'num': 10},
{'title': 'article 2', 'status': 'published', 'num': 20},
{'title': 'article 3', 'status': 'draft', 'num': 30}
])
conn.commit()
stmt = select(
articles.c.status,
func.sum(articles.c.num).label('total')
).group_by(articles.c.status)
res = conn.execute(stmt).all()
for row in res:
print(row.status, row.total)
Результат выполнения кода:
published 30
draft 30
Пример
Давайте отфильтруем группы с помощью метода
having и оставим только те, у которых
сумма больше 25:
from sqlalchemy import create_engine, MetaData, Table, Column, Integer, String, select, func
engine = create_engine('sqlite:///:memory:')
metadata = MetaData()
articles = Table(
'articles', metadata,
Column('id', Integer, primary_key=True),
Column('title', String),
Column('status', String),
Column('num', Integer)
)
metadata.create_all(engine)
with engine.connect() as conn:
conn.execute(articles.insert(), [
{'title': 'article 1', 'status': 'published', 'num': 10},
{'title': 'article 2', 'status': 'published', 'num': 20},
{'title': 'article 3', 'status': 'draft', 'num': 30}
])
conn.commit()
stmt = select(
articles.c.status,
func.sum(articles.c.num).label('total')
).group_by(articles.c.status).having(func.sum(articles.c.num) > 25)
res = conn.execute(stmt).all()
for row in res:
print(row.status, row.total)
Результат выполнения кода:
published 30
draft 30
Смотрите также
-
функцию
func,
которая создает любую SQL-функцию -
функцию
func.count,
которая считает количество строк -
функцию
func.avg,
которая вычисляет среднее значение -
функцию
func.max,
которая находит максимальное значение