diff --git a/Assessment2425DataCaseScenario.csv b/Assessment2425DataCaseScenario.csv new file mode 100644 index 0000000000000000000000000000000000000000..7e07be280f3b54205359287e8552f04610f1b3a9 --- /dev/null +++ b/Assessment2425DataCaseScenario.csv @@ -0,0 +1,21 @@ +Name,Email,DOB,Street,City,Country,Zip Code,Favorite Book,Favorite Drink,Favorite Activity,Neighbour 1,Neighbour1Email,Neighbour 2,Neighbour2Email +Person 1,person1@email.com,3/15/1995,12 Maple St,London,England,E1 6AN,A New Beginning,Lemonade,Outdoor Running,Neighbor A,neighborA@email.com,Neighbor B,neighborB@email.com +Person 2,person2@email.com,6/22/1993,45 Oak Ave,Manchester,England,M1 2WD,The Road to Success,Coffee,Hiking,Neighbor C,neighborC@email.com,Neighbor D,neighborD@email.com +Person 3,person3@email.com,9/10/1991,89 Pine Rd,Birmingham,England,B1 1AB,Endless Possibilities,Smoothie,Swimming,Neighbor E,neighborE@email.com,Neighbor F,neighborF@email.com +Person 4,person4@email.com,12/5/1998,23 Birch St,Edinburgh,Scotland,EH1 1YZ,Journey of Life,Iced Tea,Traveling,Neighbor G,neighborG@email.com,Neighbor H,neighborH@email.com +Person 5,person5@email.com,11/30/1983,67 Cedar Ln,Bristol,England,BS1 3XE,The Adventure Continues,Green Tea,Gardening,Neighbor I,neighborI@email.com,Neighbor J,neighborJ@email.com +Person 6,person6@email.com,7/18/1989,56 Elm St,Liverpool,England,L1 1AA,Finding Inner Peace,Coconut Water,Reading,Neighbor K,neighborK@email.com,Neighbor L,neighborL@email.com +Person 7,person7@email.com,4/25/1996,12 Maple St,Glasgow,Scotland,G1 2TF,Exploring New Horizons,Fruit Juice,Cycling,Neighbor M,neighborM@email.com,Neighbor N,neighborN@email.com +Person 8,person8@email.com,1/9/1990,89 Oak Dr,Leeds,England,LS1 3AB,The Great Journey,Water,Hiking,Neighbor O,neighborO@email.com,Neighbor P,neighborP@email.com +Person 9,person9@email.com,8/17/1993,123 Pine Rd,Newcastle,England,NE1 2AB,The Power of Change,Hot Chocolate,Skiing,Neighbor Q,neighborQ@email.com,Neighbor R,neighborR@email.com +Person 10,person10@email.com,10/22/1997,15 Elm St,Cardiff,Wales,CF10 3AF,New Beginnings Await,Fruit Smoothie,Jogging,Neighbor S,neighborS@email.com,Neighbor T,neighborT@email.com +Person 11,person11@email.com,5/13/1992,78 Oak Ln,Sheffield,England,S1 4GT,Wandering Souls,Sparkling Water,Rock Climbing,Neighbor U,neighborU@email.com,Neighbor V,neighborV@email.com +Person 12,person12@email.com,2/27/1986,56 Birch Rd,Nottingham,England,NG1 2PB,Freedom and Choice,Herbal Tea,Yoga,Neighbor W,neighborW@email.com,Neighbor X,neighborX@email.com +Person 13,person13@email.com,11/25/1991,10 Holy St,Cardiff,Wales,CF10 2NF,New Beginnings Await,Smoothie,Hiking,Neighbor Y,neighborY@email.com,Neighbor Z,neighborZ@email.com +Person 14,person14@email.com,2/1/1987,34 Willow Rd,Edinburgh,Scotland,EH1 1AB,Chasing Dreams,Lemonade,Running,Neighbor AA,neighborAA@email.com,Neighbor AB,neighborAB@email.com +Person 15,person15@email.com,8/12/1984,78 Cedar Ave,Cambridge,England,CB1 2SE,The Endless Journey,Iced Coffee,Cycling,Neighbor AC,neighborAC@email.com,Neighbor AD,neighborAD@email.com +Person 16,person16@email.com,3/9/1990,45 Maple Rd,Oxford,England,OX2 6TP,The Future Ahead,Fruit Juice,Yoga,Neighbor AE,neighborAE@email.com,Neighbor AF,neighborAF@email.com +Person 17,person17@email.com,11/17/1995,23 Birch Ave,Southampton,England,SO14 3HL,The Path to Glory,Green Tea,Gardening,Neighbor AG,neighborAG@email.com,Neighbor AH,neighborAH@email.com +Person 18,person18@email.com,6/20/1994,12 Elm Blvd,Leicester,England,LE1 3PL,Life�s Adventure,Coconut Water,Hiking,Neighbor AI,neighborAI@email.com,Neighbor AJ,neighborAJ@email.com +Person 19,person19@email.com,12/11/1992,56 Oak Rd,Norwich,England,NR1 4BE,Into the Wild,Herbal Tea,Swimming,Neighbor AK,neighborAK@email.com,Neighbor AL,neighborAL@email.com +Person 20,person20@email.com,9/25/1988,89 Pine Ave,Cardiff,Wales,CF10 3BC,The Adventure Continues,Water,Hiking,Neighbor AM,neighborAM@email.com,Neighbor AN,neighborAN@email.com diff --git a/Assessment2425DataCaseScenario.xlsx b/Assessment2425DataCaseScenario.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..3d4158b5d78aa101245c944834bc0fd1132e611a Binary files /dev/null and b/Assessment2425DataCaseScenario.xlsx differ diff --git a/Task 1/ER.mwb b/Task 1/ER.mwb new file mode 100644 index 0000000000000000000000000000000000000000..72a8a3a7fe415c375229f14ce7e01d26ba96df4f Binary files /dev/null and b/Task 1/ER.mwb differ diff --git a/Task 1/ER.mwb.bak b/Task 1/ER.mwb.bak new file mode 100644 index 0000000000000000000000000000000000000000..81353d4453ec6055f747deadfbea904d370b113d Binary files /dev/null and b/Task 1/ER.mwb.bak differ diff --git a/Task 1/Table_setup.sql b/Task 1/Table_setup.sql new file mode 100644 index 0000000000000000000000000000000000000000..ce9c9f0ff940a87f4931ed28833ecca4f6703040 --- /dev/null +++ b/Task 1/Table_setup.sql @@ -0,0 +1,33 @@ +CREATE TABLE person ( + PersonID INT PRIMARY KEY, + Name VARCHAR(255) NOT NULL, + Email VARCHAR(255) UNIQUE NOT NULL, + DOB DATE NOT NULL +); + +CREATE TABLE address ( + AddressID INT PRIMARY KEY, + PersonID INT, + Street VARCHAR(255) NOT NULL, + City VARCHAR(100) NOT NULL, + Country VARCHAR(100) NOT NULL, + ZipCode VARCHAR(20) NOT NULL, + FOREIGN KEY (PersonID) REFERENCES person(PersonID) ON DELETE CASCADE +); + +CREATE TABLE favorites ( + FavoriteID INT PRIMARY KEY, + PersonID INT, + FavoriteBook VARCHAR(255), + FavoriteDrink VARCHAR(255), + FavoriteActivity VARCHAR(255), + FOREIGN KEY (PersonID) REFERENCES person(PersonID) ON DELETE CASCADE +); + +CREATE TABLE neighbour ( + NeighbourID INT PRIMARY KEY, + PersonID INT, + NeighbourName VARCHAR(255), + NeighbourEmail VARCHAR(255), + FOREIGN KEY (PersonID) REFERENCES person(PersonID) ON DELETE CASCADE +); diff --git a/Task 1/adress_import.sql b/Task 1/adress_import.sql new file mode 100644 index 0000000000000000000000000000000000000000..59d861e0da8da3b7706ec972a56be22997f02947 --- /dev/null +++ b/Task 1/adress_import.sql @@ -0,0 +1,12 @@ +LOAD DATA INFILE 'C:/ProgramData/MySQL/MySQL Server 8.0/Uploads/Assessment2425DataCaseScenario.csv' +INTO TABLE Address +FIELDS TERMINATED BY ',' +LINES TERMINATED BY '\r\n' +IGNORE 1 ROWS +(@dummy1, @dummy2, @dummy3, @Street, @City, @Country, @ZipCode, @dummy4, @dummy5, @dummy6, @dummy7, @dummy8, @dummy9, @dummy10) +SET + PersonID = (SELECT PersonID FROM Person WHERE Email = @dummy2), + Street = @Street, + City = @City, + Country = @Country, + ZipCode = @ZipCode; diff --git a/Task 1/favourite_import.sql b/Task 1/favourite_import.sql new file mode 100644 index 0000000000000000000000000000000000000000..dea045ba135238fe708136757dacd998a0fd5d33 --- /dev/null +++ b/Task 1/favourite_import.sql @@ -0,0 +1,11 @@ +LOAD DATA INFILE 'C:/ProgramData/MySQL/MySQL Server 8.0/Uploads/Assessment2425DataCaseScenario.csv' +INTO TABLE Favorites +FIELDS TERMINATED BY ',' +LINES TERMINATED BY '\r\n' +IGNORE 1 ROWS +(@dummy1, @dummy2, @dummy3, @dummy4, @dummy5, @dummy6, @dummy7, @FavoriteBook, @FavoriteDrink, @FavoriteActivity, @dummy8, @dummy9, @dummy10, @dummy11) +SET + PersonID = (SELECT PersonID FROM Person WHERE Email = @dummy2), + FavoriteBook = @FavoriteBook, + FavoriteDrink = @FavoriteDrink, + FavoriteActivity = @FavoriteActivity; diff --git a/Task 1/initial_setup.sql b/Task 1/initial_setup.sql new file mode 100644 index 0000000000000000000000000000000000000000..999b87f8152d508c10ed6e818a0982b08b130c1e --- /dev/null +++ b/Task 1/initial_setup.sql @@ -0,0 +1,2 @@ +CREATE DATABASE PeopleDB; +USE PeopleDB; \ No newline at end of file diff --git a/Task 1/neighbour2_import.sql b/Task 1/neighbour2_import.sql new file mode 100644 index 0000000000000000000000000000000000000000..6573c29d4070366fcd73d63612671ed75eff8739 --- /dev/null +++ b/Task 1/neighbour2_import.sql @@ -0,0 +1,11 @@ +LOAD DATA INFILE 'C:/ProgramData/MySQL/MySQL Server 8.0/Uploads/Assessment2425DataCaseScenario.csv' +INTO TABLE Neighbour +FIELDS TERMINATED BY ',' +LINES TERMINATED BY '\r\n' +IGNORE 1 ROWS +(@dummy1, @dummy2, @dummy3, @du +mmy4, @dummy5, @dummy6, @dummy7, @dummy8, @dummy9, @dummy10, @Neighbour1, @Neighbour1Email, @Neighbour2, @Neighbour2Email) +SET + PersonID = (SELECT PersonID FROM Person WHERE Email = @dummy2), + NeighbourName = @Neighbour2, + NeighbourEmail = @Neighbour2Email; diff --git a/Task 1/neighbour_import.sql b/Task 1/neighbour_import.sql new file mode 100644 index 0000000000000000000000000000000000000000..a2732929fba2009803252dc4f7672ba1112d0922 --- /dev/null +++ b/Task 1/neighbour_import.sql @@ -0,0 +1,10 @@ +LOAD DATA INFILE 'C:/ProgramData/MySQL/MySQL Server 8.0/Uploads/Assessment2425DataCaseScenario.csv' +INTO TABLE Neighbour +FIELDS TERMINATED BY ',' +LINES TERMINATED BY '\r\n' +IGNORE 1 ROWS +(@dummy1, @dummy2, @dummy3, @dummy4, @dummy5, @dummy6, @dummy7, @dummy8, @dummy9, @dummy10, @Neighbour1, @Neighbour1Email, @Neighbour2, @Neighbour2Email) +SET + PersonID = (SELECT PersonID FROM Person WHERE Email = @dummy2), + NeighbourName = @Neighbour1, + NeighbourEmail = @Neighbour1Email; diff --git a/Task 1/person_import.sql b/Task 1/person_import.sql new file mode 100644 index 0000000000000000000000000000000000000000..cc861cc1b167bfd12561c26264d8980aaa9ea2a5 --- /dev/null +++ b/Task 1/person_import.sql @@ -0,0 +1,9 @@ +LOAD DATA INFILE 'C:/ProgramData/MySQL/MySQL Server 8.0/Uploads/Assessment2425DataCaseScenario.csv' +INTO TABLE Person +FIELDS TERMINATED BY ',' +LINES TERMINATED BY '\r\n' +IGNORE 1 ROWS +(@Name, Email, @DOB, @dummy1, @dummy2, @dummy3, @dummy4, @dummy5, @dummy6, @dummy7, @dummy8, @dummy9, @dummy10, @dummy11) +SET + PersonID = CAST(SUBSTRING_INDEX(@Name, ' ', -1) AS UNSIGNED), -- Extracts numeric ID + DOB = STR_TO_DATE(@DOB, '%m/%d/%Y'); diff --git a/Task 2/insert_data.py b/Task 2/insert_data.py new file mode 100644 index 0000000000000000000000000000000000000000..b6e4cb4866829de2e49914c3463d3c675d191fae --- /dev/null +++ b/Task 2/insert_data.py @@ -0,0 +1,39 @@ +import pandas as pd +from setup import collection + +# Load the Excel file (update the filename if needed) +file_path = "Assessment2425DataCaseScenario.xlsx" # Change to the correct file path +df = pd.read_excel(file_path) + +# Convert Excel data to a format suitable for MongoDB +persons_data = [] +for _, row in df.iterrows(): + person = { + "name": row["Name"], + "email": row["Email"], + "dob": row["DOB"], + "address": { + "street": row["Street"], + "city": row["City"], + "country": row["Country"], + "zip_code": str(row["Zip Code"]) # Convert zip code to string to prevent issues + }, + "favourites": { + "book": row["Favorite Book"], + "drink": row["Favorite Drink"], + "activity": row["Favorite Activity"] + }, + "neighbours": [ + {"name": row["Neighbour 1"], "email": row["Neighbour1Email"]} if pd.notna(row["Neighbour 1"]) else None, + {"name": row["Neighbour 2"], "email": row["Neighbour2Email"]} if pd.notna(row["Neighbour 2"]) else None + ] + } + + # Remove None values (if no neighbour exists) + person["neighbours"] = [n for n in person["neighbours"] if n is not None] + + persons_data.append(person) + +# Insert data into MongoDB +collection.insert_many(persons_data) +print("Excel data inserted into MongoDB successfully!") diff --git a/Task 2/queries.py b/Task 2/queries.py new file mode 100644 index 0000000000000000000000000000000000000000..3852cedc2a5c8cc966eb904f45bcaeb4606ab589 --- /dev/null +++ b/Task 2/queries.py @@ -0,0 +1,61 @@ +from setup import collection +from datetime import datetime + +# Function to calculate age from DOB +def calculate_age(dob): + if isinstance(dob, str): # If dob is a string, convert it + dob = datetime.strptime(dob, "%Y-%m-%d") # Adjust format if needed + + birth_year = dob.year # Extract year directly + current_year = datetime.now().year + return current_year - birth_year + +### 1️⃣ Display Person's Name and Age +print("\n--- Persons and Their Age ---") +for person in collection.find({}, {"name": 1, "dob": 1}): + age = calculate_age(person["dob"]) + print(f"Name: {person['name']}, Age: {age}") + +### 2️⃣ Group Persons by Their Favourite Drink and Return Average Age +print("\n--- Average Age by Favourite Drink ---") +pipeline = [ + { + "$group": { + "_id": "$favourites.drink", + "average_age": {"$avg": {"$subtract": [datetime.now().year, {"$toInt": {"$substr": ["$dob", 0, 4]}}]}} + } + } +] +results = collection.aggregate(pipeline) +for res in results: + print(f"Drink: {res['_id']}, Average Age: {res['average_age']}") + +### 3️⃣ Display Average Age of People Who Like Hiking +print("\n--- Average Age of People Who Like Hiking ---") +pipeline = [ + {"$match": {"favourites.activity": "Hiking"}}, + { + "$group": { + "_id": None, + "average_age": {"$avg": {"$subtract": [datetime.now().year, {"$toInt": {"$substr": ["$dob", 0, 4]}}]}} + } + } +] +result = list(collection.aggregate(pipeline)) +print(f"Average age of people who like Hiking: {result[0]['average_age']}") + +### 4️⃣ Display Total Number of People from Each City +print("\n--- Total Number of People per City ---") +pipeline = [ + {"$group": {"_id": "$address.city", "total_people": {"$sum": 1}}}, + {"$sort": {"total_people": 1}} +] +results = collection.aggregate(pipeline) +for res in results: + print(f"City: {res['_id']}, Total People: {res['total_people']}") + +### 5️⃣ Display Name of Person(s) Whose Neighbour is 'Neighbour C' +print("\n--- People Whose Neighbour is 'Neighbour C' ---") +results = collection.find({"neighbours.name": "Neighbor C"}, {"name": 1, "_id": 0}) +for person in results: + print(person["name"]) diff --git a/Task 2/setup.py b/Task 2/setup.py new file mode 100644 index 0000000000000000000000000000000000000000..3fedda2731729577e67b2e18192aeb921db22944 --- /dev/null +++ b/Task 2/setup.py @@ -0,0 +1,10 @@ +from pymongo import MongoClient + +# Connect to MongoDB +client = MongoClient("mongodb://localhost:27017/") + +# Create the database and collection +db = client["task2_nosql"] +collection = db["persons"] + +print("MongoDB connection successful!") diff --git a/__pycache__/setup.cpython-313.pyc b/__pycache__/setup.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..c6f6bd13c3f6b59b801666c39151b69a8116b12c Binary files /dev/null and b/__pycache__/setup.cpython-313.pyc differ