Вычисления в запросе

Введение в базы данных на Python

Jason Myers

Co-Author of Essential SQLAlchemy and Software Engineer

Математические операторы

  • сложение +
  • вычитание -
  • умножение *
  • деление /
  • остаток от деления %
  • Работают по-разному для разных типов данных
Введение в базы данных на Python

Вычисление разности

stmt = select([census.columns.age,           
        (census.columns.pop2008 -
        census.columns.pop2000).label('pop_change')
    ])

stmt = stmt.group_by(census.columns.age) stmt = stmt.order_by(desc('pop_change'))
stmt = stmt.limit(5)
results = connection.execute(stmt).fetchall() print(results)
[(61, 52672), (85, 51901), (54, 50808), (58, 45575),
(60, 44915)]
Введение в базы данных на Python

Оператор case

  • Позволяет обрабатывать данные по-разному в зависимости от условия
  • Принимает список условий и столбец, возвращаемый при совпадении
  • Список условий завершается блоком else — для записей, не удовлетворяющих ни одному условию
Введение в базы данных на Python

Пример оператора case

from sqlalchemy import case

stmt = select([ func.sum( case([ (census.columns.state == 'New York', census.columns.pop2008) ], else_=0))])
results = connection.execute(stmt).fetchall() print(results)
[(19465159,)]
Введение в базы данных на Python

Оператор cast

  • Преобразует данные к другому типу
  • Удобно для преобразования...
    • целых чисел в числа с плавающей точкой для деления
    • строк в даты и время
  • Принимает столбец или выражение и целевой тип
Введение в базы данных на Python

Пример вычисления процентов

from sqlalchemy import case, cast, Float

stmt = select([ (func.sum( case([ (census.columns.state == 'New York', census.columns.pop2008) ], else_=0)) / cast(func.sum(census.columns.pop2008), Float) * 100).label('ny_percent')])
results = connection.execute(stmt).fetchall() print(results)
[(Decimal('6.4267619765'),)]
Введение в базы данных на Python

Давайте потренируемся!

Введение в базы данных на Python

Preparing Video For Download...