¿Cómo agrupar y sumar columnas SQL usando SQLAlchemy?

En este artículo, vamos a ver cómo usar GroupBy y Sum en SQLAlchemy.

Instalando SQLAlchemy

SQLAlchemy está disponible a través del paquete de instalación pip.

pip install sqlalchemy

Sin embargo, si está utilizando un matraz, puede utilizar su propia implementación de SQLAlchemy. Se puede instalar usando –

pip install flask-sqlalchemy

En los ejemplos, haremos uso de la sintaxis común.

  • sqlalchemy.create_engine(URL): crea un objeto de motor que se puede usar directamente para interactuar con la base de datos o se puede pasar a un objeto de sesión para trabajar con el ORM. La forma típica de una URL de base de datos es “dialecto+controlador://nombre de usuario:contraseña@host:puerto/base de datos”
  • sqlalchemy.select(*entities): la construcción principal utilizada para generar declaraciones SELECT. Las entidades suelen ser una serie de columnas para seleccionar.
  • sqlalchemy.select(*entities).group_by(column_name): la construcción principal utilizada para generar instrucciones GROUP BY.
  • sqlalchemy.func.sum(column_name): La función agregada SQL SUM().
  • sqlalchemy.engine.execute(statement): ejecuta la declaración dada y devuelve un objeto de resultado.

Usando GroupBy y Sum en columnas

Ejemplo 1:

Antes de seguir adelante, necesitamos tener una base de datos y una tabla con la que trabajar. Para este ejemplo, estamos usando la base de datos mySQL y hemos creado una tabla de ventas . La tabla tiene 3 columnas y 9 registros como se muestra a continuación.

mesa de ventas

En la tabla anterior, usaremos la columna de la empresa para la agrupación y la agregación se realizará en la columna no_of_invoices .

Python

import sqlalchemy as db
  
# Define the Engine (Connection Object)
engine = db.create_engine(
    "mysql+pymysql://root:password@localhost/Geeks4Geeks")
  
# Create the Metadata Object
meta_data = db.MetaData(bind=engine)
db.MetaData.reflect(meta_data)
  
# Get the `sales` table from the Metadata object
SALES = meta_data.tables['sales']
  
# SQLAlchemy Query to GROUP BY and aggregate SUM
query = db.select([SALES.c.company, db.func.sum(SALES.c.no_of_invoices)]) \
    .group_by(SALES.c.company)
  
# Fetch all the records
result = engine.execute(query).fetchall()
  
# View the records
for record in result:
    print("\n", "Company:", record[0],
          "| Sum of Invoices:", 
          record[1])

Producción:

Ejemplo 1 Salida

Explicación:

  • Primero importamos la biblioteca sqlalchemy como db para simplificar. Todos los objetos, métodos, etc. de sqlalchemy se importarán utilizando el prefijo db para una mayor claridad.
  • Luego creamos el motor que servirá como conexión a la base de datos para realizar todas las operaciones de la base de datos.
  • Cree el objeto de metadatos. El objeto de metadatos `metadata` contiene toda la información sobre nuestra base de datos.
  • Utilice la información de los metadatos para obtener la tabla de ventas de la base de datos.
  • Ahora podemos escribir una consulta SQLAlchemy para obtener los registros requeridos. Primero agrupamos según el nombre de la empresa usando el método `group_by()` y luego encontramos la suma del número de facturas usando la función `func.sum()` de SQLalchemy.
  • Imprima la salida. En la salida podemos ver que tenemos las distintas denominaciones sociales y su correspondiente suma de facturas producidas.

Ejemplo 2:

En este ejemplo, consideremos la siguiente tabla de estudiantes

mesa de estudiantes

En este ejemplo, realizaremos una operación GROUP BY tomando dos columnas como referencia.

Python

import sqlalchemy as db
  
# Define the Engine (Connection Object)
engine = db.create_engine(
    "mysql+pymysql://root:password@localhost/Geeks4Geeks")
  
# Create the Metadata Object
meta_data = db.MetaData(bind=engine)
db.MetaData.reflect(meta_data)
  
# Get the `students` table from the Metadata object
STUDENTS = meta_data.tables['students']
  
# SQLAlchemy Query to GROUP BY and aggregate SUM
query = db.select([
    STUDENTS.c.first_name,
    STUDENTS.c.last_name,
    db.func.sum(STUDENTS.c.score)
]).group_by(STUDENTS.c.first_name, STUDENTS.c.last_name)
  
# Fetch all the records
result = engine.execute(query).fetchall()
  
# View the records
for record in result:
    print("\n", record[0], record[1],
          "| Total Score:", record[2])

Producción:

Ejemplo 2 Salida

Explicación:

El código anterior es bastante similar al discutido en el Ejemplo 1, excepto por el hecho de que en este ejemplo realizamos la operación GROUP BY en varias columnas, a saber, los campos first_name y last_name . Se pueden mencionar varios campos dentro del método group_by() como parámetros separados.

Ejemplo 3:

Teniendo en cuenta la tabla de estudiantes mencionada en el Ejemplo 2, veamos cómo cambia la salida si realizamos la operación GROUP BY en el campo del curso .

Python

import sqlalchemy as db
  
# Define the Engine (Connection Object)
engine = db.create_engine(
    "mysql+pymysql://root:password@localhost/Geeks4Geeks")
  
# Create the Metadata Object
meta_data = db.MetaData(bind=engine)
db.MetaData.reflect(meta_data)
  
# Get the `students` table from the Metadata object
STUDENTS = meta_data.tables['students']
  
# SQLAlchemy Query to GROUP BY and aggregate SUM
query = db.select([
    STUDENTS.c.course,
    db.func.sum(STUDENTS.c.score)
]).group_by(STUDENTS.c.course)
  
# Fetch all the records
result = engine.execute(query).fetchall()
  
# View the records
for record in result:
    print("\n", "Course:", record[0],
          "| Total Score:", record[1])

Producción:

Ejemplo 3 Salida

Publicación traducida automáticamente

Artículo escrito por apathak092 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *