diff --git a/LittleLemonDM.mwb b/LittleLemonDM.mwb index 205869c..fb35b54 100644 Binary files a/LittleLemonDM.mwb and b/LittleLemonDM.mwb differ diff --git a/env.yml b/env.yml index dc81992..f924ead 100644 --- a/env.yml +++ b/env.yml @@ -2,11 +2,11 @@ name: capstone-project channels: - conda-forge dependencies: - - pip - python=3.13 - - pynvim - - pytest + - pip + - jupyter - mysql-connector-python + - pynvim - pip: - ruff - basedpyright diff --git a/promotional_campaign.ipynb b/promotional_campaign.ipynb new file mode 100644 index 0000000..43116cb --- /dev/null +++ b/promotional_campaign.ipynb @@ -0,0 +1,216 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "3228e84e-083c-48f6-9913-9d96e2fd0a2a", + "metadata": {}, + "source": [ + "# Promotional campaign" + ] + }, + { + "cell_type": "markdown", + "id": "71a559ef-75a7-4aca-86aa-10629e047222", + "metadata": {}, + "source": [ + "## Imports" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "id": "8fe32f7f-09b3-4d9a-af26-4146c500bf44", + "metadata": {}, + "outputs": [], + "source": [ + "from decimal import Decimal\n", + "from mysql.connector import CMySQLConnection, Error, connect\n", + "from mysql.connector.cursor_cext import CMySQLCursor" + ] + }, + { + "cell_type": "markdown", + "id": "70da0c3b-ae18-4b60-a7eb-1c0c75c3677a", + "metadata": {}, + "source": [ + "## Task 1" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "ac95c33d-3ead-4dab-b007-4f20d37f7386", + "metadata": {}, + "outputs": [], + "source": [ + "connection = connect(\n", + " user=\"tobias\",\n", + " unix_socket=\"/run/mysqld/mysqld.sock\",\n", + " database=\"LittleLemonDB\",\n", + " use_pure=False,\n", + " autocommit=True,\n", + ")\n", + "assert isinstance(connection, CMySQLConnection)" + ] + }, + { + "cell_type": "markdown", + "id": "19e74d2d-2b40-4a1b-a57e-38f27106220b", + "metadata": {}, + "source": [ + "## Task 2" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "1b386dae-78e4-44db-90e5-6da378de16fe", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Tables:\n", + " Addresses\n", + " Bookings\n", + " Customers\n", + " Employees\n", + " MenuItems\n", + " OrderItems\n", + " Orders\n" + ] + } + ], + "source": [ + "try:\n", + " with connection.cursor() as cursor:\n", + " assert isinstance(cursor, CMySQLCursor)\n", + "\n", + " _ = cursor.execute(\"show tables\")\n", + " print(\"Tables:\")\n", + " for (table_name,) in cursor:\n", + " print(f\" {table_name}\")\n", + "except Error as err:\n", + " print(err)" + ] + }, + { + "cell_type": "markdown", + "id": "62e2485b-1391-4fc6-aa73-35d0ebd8e95d", + "metadata": {}, + "source": [ + "## Task 3\n", + "**SQL query in `sql/promotional_campaign.sql`:**\n", + "```sql\n", + "select\n", + " C.FirstName,\n", + " C.LastName,\n", + " C.PhoneNumber,\n", + " C.EmailAddress,\n", + " max(O.BillAmount) as MaxBillAmount\n", + "from Orders as O\n", + "inner join Bookings as B on O.BookingID = B.BookingID\n", + "inner join Customers as C on B.CustomerID = C.CustomerID\n", + "group by C.CustomerID\n", + "having MaxBillAmount > 60.00;\n", + "```" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "id": "214d0b0e-dd5b-4113-b6d7-aca020655ef3", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "Customers that placed an order greater then 60.00€:\n", + " Li Wei Zhang\n", + " Minimum bill amount: 82.50€\n", + " Phone number: +86123456789\n", + " Email address: li.wei.zhang@example.com\n", + " Ivanov Petrov\n", + " Minimum bill amount: 150.50€\n", + " Phone number: +70987654321\n", + " Email address: ivanov.petrov@example.com\n" + ] + } + ], + "source": [ + "with open(\"./sql/promotional_campaign.sql\") as promo_campaign_file:\n", + " promo_campain_request = promo_campaign_file.read()\n", + " \n", + "try:\n", + " with connection.cursor() as cursor:\n", + " assert isinstance(cursor, CMySQLCursor)\n", + " _ = cursor.execute(promo_campain_request)\n", + "\n", + " print()\n", + "\n", + " print(\"Customers that placed an order greater then 60.00€:\")\n", + " for (\n", + " first_name,\n", + " last_name,\n", + " phone_number,\n", + " email_address,\n", + " min_bill_amount,\n", + " ) in cursor:\n", + " assert isinstance(first_name, str)\n", + " assert isinstance(last_name, str)\n", + " assert isinstance(phone_number, str)\n", + " assert isinstance(email_address, str | None)\n", + " assert isinstance(min_bill_amount, Decimal)\n", + " print(f\" {first_name} {last_name}\")\n", + " print(f\" Minimum bill amount: {min_bill_amount}€\")\n", + " print(f\" Phone number: {phone_number}\")\n", + " if email_address:\n", + " print(f\" Email address: {email_address}\")\n", + "except Error as err:\n", + " print(err)" + ] + }, + { + "cell_type": "markdown", + "id": "be3c702d-5ab6-47a6-a19b-4e26aefdbd6e", + "metadata": {}, + "source": [ + "## Cleanup" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "id": "e7f0a6dc-4940-4f8b-a89c-e714e9d375ba", + "metadata": {}, + "outputs": [], + "source": [ + "connection.close()" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.13.0" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/sql/promotional_campaign.sql b/sql/promotional_campaign.sql new file mode 100644 index 0000000..2fcd693 --- /dev/null +++ b/sql/promotional_campaign.sql @@ -0,0 +1,11 @@ +select + C.FirstName, + C.LastName, + C.PhoneNumber, + C.EmailAddress, + max(O.BillAmount) as MaxBillAmount +from Orders as O +inner join Bookings as B on O.BookingID = B.BookingID +inner join Customers as C on B.CustomerID = C.CustomerID +group by C.CustomerID +having MaxBillAmount > 60.00;