-
Notifications
You must be signed in to change notification settings - Fork 0
Home
🇬🇧 English first · 🇪🇸 Español más abajo.
Sales performance and profitability analysis in plain SQL over 10.000 synthetic transactions — five queries that answer the questions a SalesOps team actually asks, written to run unchanged on SQLite.
Repo: mindset-code/project-sales-optimization-sql
- Queries SQL — the five queries, one by one, with what each returns
- Dataset y resultados — the columns, how they are generated, and the real aggregates
flowchart LR
A["generate_data.py"] -->|10.000 rows| B["sales_data.csv"]
B -->|import as table sales_data| C["SQLite"]
C -->|sales_analysis.sql| D["5 result sets"]
D --> E["Power BI · Tableau"]
The whole project is two files: a 35-line generator and a 63-line SQL script. There is no application, no ORM and no notebook — the point is the SQL.
| Layer | Technology |
|---|---|
| Queries | SQL, written for SQLite (strftime is SQLite syntax) |
| Data generation | Python · pandas · NumPy, np.random.seed(42)
|
| BI target | Power BI · Tableau |
| Domain | SalesOps · RevOps · Business Intelligence |
The queries are standard aggregation except for one function. sales_analysis.sql
uses strftime('%Y-%m', SaleDate), which is SQLite. To run the monthly trend on
another engine:
| Engine | Replacement |
|---|---|
| PostgreSQL | TO_CHAR(SaleDate, 'YYYY-MM') |
| MySQL | DATE_FORMAT(SaleDate, '%Y-%m') |
| SQL Server | FORMAT(SaleDate, 'yyyy-MM') |
Everything else — SUM, AVG, COUNT, GROUP BY, HAVING, LIMIT — runs as is,
except that SQL Server writes LIMIT 5 as TOP 5.
generate_data.py finishes with an absolute path from the machine it was written on:
df.to_csv('/home/ubuntu/project3_sales_sql/sales_data.csv', index=False)Anyone cloning the repository will get a FileNotFoundError. The CSV is committed,
so the queries can be run without regenerating anything, but the line should read
df.to_csv('sales_data.csv', index=False).
Análisis de rendimiento y rentabilidad de ventas en SQL puro sobre 10.000 transacciones sintéticas — cinco consultas que responden a las preguntas que se hace de verdad un equipo de SalesOps, escritas para ejecutarse sin cambios en SQLite.
Repo: mindset-code/project-sales-optimization-sql
- Queries SQL — las cinco consultas, una a una, con lo que devuelve cada cual
- Dataset y resultados — las columnas, cómo se generan y los agregados reales
Ver el diagrama de arriba. Todo el proyecto son dos ficheros: un generador de 35 líneas y un script SQL de 63. No hay aplicación, ni ORM, ni cuaderno — lo que importa aquí es el SQL.
| Capa | Tecnología |
|---|---|
| Consultas | SQL, escrito para SQLite (strftime es sintaxis de SQLite) |
| Generación de datos | Python · pandas · NumPy, np.random.seed(42)
|
| Destino BI | Power BI · Tableau |
| Dominio | SalesOps · RevOps · Business Intelligence |
Las consultas son agregación estándar salvo por una función. sales_analysis.sql
usa strftime('%Y-%m', SaleDate), que es de SQLite. Para ejecutar la tendencia
mensual en otro motor:
| Motor | Sustituto |
|---|---|
| PostgreSQL | TO_CHAR(SaleDate, 'YYYY-MM') |
| MySQL | DATE_FORMAT(SaleDate, '%Y-%m') |
| SQL Server | FORMAT(SaleDate, 'yyyy-MM') |
Todo lo demás —SUM, AVG, COUNT, GROUP BY, HAVING, LIMIT— funciona tal
cual, salvo que SQL Server escribe LIMIT 5 como TOP 5.
generate_data.py termina con una ruta absoluta de la máquina donde se escribió:
df.to_csv('/home/ubuntu/project3_sales_sql/sales_data.csv', index=False)Quien clone el repositorio se encontrará un FileNotFoundError. El CSV está
versionado, así que las consultas se pueden ejecutar sin regenerar nada, pero esa
línea debería decir df.to_csv('sales_data.csv', index=False).