From 4a4db2d7c3e550b45bcacd402e6091049921e126 Mon Sep 17 00:00:00 2001 From: Vlad Stetsenko Date: Tue, 10 Apr 2018 13:09:05 +0300 Subject: [PATCH 1/5] Update laboratory2.sql --- km52/Stetsenko_Vladyslav/laboratory2.sql | 31 ++++++++++++++++++++++-- 1 file changed, 29 insertions(+), 2 deletions(-) diff --git a/km52/Stetsenko_Vladyslav/laboratory2.sql b/km52/Stetsenko_Vladyslav/laboratory2.sql index e2d50180..891576ca 100644 --- a/km52/Stetsenko_Vladyslav/laboratory2.sql +++ b/km52/Stetsenko_Vladyslav/laboratory2.sql @@ -1,2 +1,29 @@ --- LABORATORY WORK 2 --- BY Stetsenko_Vladyslav +/*--------------------------------------------------------------------------- +1. Вивести ключ покупця та ключ продукту, за умови, що покупець ніколи не купляв даний продукт. + +---------------------------------------------------------------------------*/ +--Код відповідь: +SELECT PRODUCTS.PROD_ID, CUSTOMERS.CUST_ID FROM ( + CUSTOMERS JOIN ORDERS + ON ORDERS.CUST_ID=CUSTOMERS.CUST_ID JOIN ORDERITEMS + ON ORDERS.ORDER_NUM=ORDERITEMS.ORDER_NUM JOIN PRODUCTS + ON ORDERITEMS.PROD_ID=PRODUCTS.PROD_ID +) WHERE ORDERS.ORDER_NUM is NULL +; + + + + + + + +/*--------------------------------------------------------------------------- +2. Вивести ключ постачальника, що працював з покупцем, що має найдорожче замовлення. + +---------------------------------------------------------------------------*/ + +--Код відповідь: + +SELECT VENDORS.VEND_ID, MAX(ORDERITEMS.ITEM_PRICE) FROM PRODUCTS JOIN VENDORS + ON PRODUCTS.VEND_ID=VENDORS.VEND_ID JOIN ORDERITEMS + ON ORDERITEMS.PROD_ID=PRODUCTS.PROD_ID GROUP BY VENDORS.VEND_ID; From 421cc9bef930a95384aea34e7b3ae974cb9635c3 Mon Sep 17 00:00:00 2001 From: josephlouislg Date: Thu, 17 May 2018 22:41:52 +0300 Subject: [PATCH 2/5] add vizualization lab --- km52/Stetsenko_Vladyslav/laboratory3.sql | 47 ++++++++- km52/Stetsenko_Vladyslav/vizualization.py | 120 ++++++++++++++++++++++ 2 files changed, 165 insertions(+), 2 deletions(-) create mode 100644 km52/Stetsenko_Vladyslav/vizualization.py diff --git a/km52/Stetsenko_Vladyslav/laboratory3.sql b/km52/Stetsenko_Vladyslav/laboratory3.sql index 597f926d..a7366ece 100644 --- a/km52/Stetsenko_Vladyslav/laboratory3.sql +++ b/km52/Stetsenko_Vladyslav/laboratory3.sql @@ -1,2 +1,45 @@ --- LABORATORY WORK 3 --- BY Stetsenko_Vladyslav +/*1. Написати PL/SQL код, що додає постачальників, щоб сумарна кількість усіх постачальників була 7. Ключі постачальників v1….vn. +Решта значень обов’язкових полів відповідає полям постачальника з ключем BRS01. +10 балів*/ +DECLARE + vend_count NUMBER(1); + vend_name vendors.vend_name%TYPE; + ins_ord_count NUMBER(1); + vend_id customers.cust_id%TYPE := 1000000001 +BEGIN + select count(*) into vend_count from VENDORS where vend_id = vend_id; + select vend_name into from VENDORS where vend_id = 'BRS01'; + ins_ord_count := 7 - vend_count; + IF vend_count < 7 THEN + FOR vend_id IN 1..ins_ord_count LOOP + INSERT INTO VENDORS VALUES(vend_id, vend_name); + END LOOP; + END IF; +END; + +/*2. Написати PL/SQL код, що по вказаному ключу замовника виводить у консоль його ключ та визначає його статус. +Якщо він зробив 3 замовлення - статус = "3" +Якщо він не зробив 3 замовлення - статус = "no 3" +Якщо він немає замовлення - статус = "unknown*/ + + + +/*3. Створити представлення та використати його у двох запитах: + +3.1. Скільки замовлень було зроблено покупцями з Германії. +3.2. Вивести назву продукту, що продавався більше ніж у 3 різних замовленнях. +6 балів.*/ + +CREATE VIEW orders_view as + SELECT PRODUCTS.PROD_NAME, ORDERS.ORDER_NUM, CUSTOMERS.CUST_COUNTRY FROM ORDERS JOIN CUSTOMERS ON ORDERS.CUST_ID = CUSTOMERS.CUST_ID + JOIN ORDERITEMS ON ORDERS.ORDER_NUM = ORDERITEMS.ORDER_NUM + JOIN PRODUCTS ON ORDERITEMS.PROD_ID = PRODUCTS.PROD_ID; + +SELECT COUNT(*) FROM orders_view WHERE CUST_COUNTRY = 'Германія'; + +SELECT PROD_NAME FROM( + SELECT PROD_NAME, COUNT(ORDER_NUM) as order_count FROM orders_view GROUP BY PROD_NAME) + WHERE order_count > 2; + + + diff --git a/km52/Stetsenko_Vladyslav/vizualization.py b/km52/Stetsenko_Vladyslav/vizualization.py new file mode 100644 index 00000000..1b7bb1f8 --- /dev/null +++ b/km52/Stetsenko_Vladyslav/vizualization.py @@ -0,0 +1,120 @@ +import cx_Oracle +import plotly.plotly as py +import plotly.graph_objs as go +from plotly.tools import set_credentials_file + + +class Vizualizator: + def __init__(self, username, api_key): + set_credentials_file(username=username, api_key=api_key) + + @staticmethod + def bar(x, y, x_title, y_title, main_title, filename): + data = [go.Bar( + x=x, + y=y + )] + layout = go.Layout( + title=main_title, + xaxis=dict( + title=x_title, + titlefont=dict( + family='Courier New, monospace', + size=18, + color='#7f7f7f' + ) + ), + yaxis=dict( + title=y_title, + rangemode='nonnegative', + autorange=True, + titlefont=dict( + family='Courier New, monospace', + size=18, + color='#7f7f7f' + ) + ) + ) + fig = go.Figure(data=data, layout=layout) + py.plot(fig, filename=filename) + + @staticmethod + def pie(labels, values, filename): + pie = go.Pie(labels=labels, values=values) + py.plot([pie], filename=filename) + + +class DB_Wrapper: + def __init__(self, db_port, db_host, username, password, db): + connstr = '{0}/{1}@{2}:{3}/{4}'.format(username, password, db_host, db_port, db) + self.conn = cx_Oracle.connect(connstr) + self.cursor = self.conn.cursor() + + def get_tourists_per_date(self): + query = """ + SELECT tourist.vacation_from, COUNT(tourist.tourist_id) as tourists + FROM tourist + GROUP BY tourist.vacation_from ORDER BY COUNT(tourist.vacation_from) + """ + dates = [] + tourists = [] + self.cursor.execute(query) + for date, count in self.cursor: + dates.append(date) + tourists.append(count) + return (dates, tourists) + + def get_tourists_count_per_hotel(self): + query = """ + SELECT hotel.hotel__name, COUNT(tourist.hotel_id) as tourists + FROM tourist JOIN hotel on tourist.hotel_id=hotel.hotel_id + GROUP BY hotel.hotel__name ORDER BY COUNT(tourist.hotel_id) + """ + hotels = [] + tourists = [] + self.cursor.execute(query) + for name, count in self.cursor: + hotels.append(name) + tourists.append(count) + return (hotels, tourists) + + +if __name__ == '__main__': + db_client = DB_Wrapper( + username='username', + password='password', + db='db_name', + db_host='127.0.0.1', + db_port=1521 + ) + vizualizator = Vizualizator(username='username', api_key='api_key') + x, y = db_client.get_tourists_per_date() + data = { + 'x': x, + 'y': y, + "main_title": "Tourists per date", + "x_title": "Dates", + "y_title": "Tourists count", + "filename": "hotels-date-tourists-count" + } + vizualizator.bar(**data) + + x, y = db_client.get_tourists_count_per_hotel() + data = { + 'x': x, + 'y': y, + "main_title": "Tourists per hotel", + "x_title": "Hotels", + "y_title": "Tourists count", + "filename": "hotels-tourists-count" + } + vizualizator.bar(**data) + + data = { + "filename": "hotels-tourists-sum", + "labels": x, + "values": y + } + vizualizator.pie(**data) + + From 9c1a3aefbc922cc211d64adb0e4843c604e28cc2 Mon Sep 17 00:00:00 2001 From: josephlouislg Date: Fri, 18 May 2018 18:39:00 +0300 Subject: [PATCH 3/5] add export/import lab --- km52/Stetsenko_Vladyslav/export_csv.py | 40 +++++++++++++++ km52/Stetsenko_Vladyslav/import_csv.py | 62 +++++++++++++++++++++++ km52/Stetsenko_Vladyslav/vizualization.py | 4 +- 3 files changed, 103 insertions(+), 3 deletions(-) create mode 100644 km52/Stetsenko_Vladyslav/export_csv.py create mode 100644 km52/Stetsenko_Vladyslav/import_csv.py diff --git a/km52/Stetsenko_Vladyslav/export_csv.py b/km52/Stetsenko_Vladyslav/export_csv.py new file mode 100644 index 00000000..e0a74da8 --- /dev/null +++ b/km52/Stetsenko_Vladyslav/export_csv.py @@ -0,0 +1,40 @@ +import cx_Oracle +import csv + + +connstr = 'username/password@HOST:PORT/xe' +conn = cx_Oracle.connect(connstr) +cursor = conn.cursor() + + +# query = """ +# SELECT +# hotel.hotel__name, tourist.tourist_first_name, +# tourist.hotel_id, +# tourist.tourist_id +# FROM tourist JOIN hotel on tourist.hotel_id=hotel.hotel_id +# """ +# cursor.execute(query) +# f = open('toursit_hotel.csv', 'w') +# writer = csv.writer(f) +# writer.writerow(["tourist_id", "tourist_name", "hotel_id", "hotel_name"]) + +# for hotel_name, tourist_name, hotel_id, tourist_id in cursor: +# writer.writerow([tourist_id, tourist_name, hotel_id, hotel_name]) +# f.close() + + +query = "SELECT hotel_name, hotel_id FROM hotels" +cursor.execute(query) +for hotel_name, hotel_id in cursor: + f = open('hotels_'+ str(hotel_id)+".csv", 'w') + writer = csv.writer(file) + writer.writerow(["ID", hotel_id]) + writer.writerow(["Name", hotel_name]) + tourist_query = "SELECT tourist_id, tourist_name FROM tourists WHERE hotel_id={0}".format(hotel_id) + cursor.execute(tourist_query) + writer.writerow([]) + writer.writerow(['tourist_id', 'tourist_name']) + for row in cursor: + writer.writerow(row) + f.close() \ No newline at end of file diff --git a/km52/Stetsenko_Vladyslav/import_csv.py b/km52/Stetsenko_Vladyslav/import_csv.py new file mode 100644 index 00000000..2d589288 --- /dev/null +++ b/km52/Stetsenko_Vladyslav/import_csv.py @@ -0,0 +1,62 @@ +#import pandas as pd +import cx_Oracle +import csv + +filename = '' +connstr = 'username/password@HOST:PORT/xe' +conn = cx_Oracle.connect(connstr) +cursor = conn.cursor() + +insert_hotel_query = """ + INSERT INTO hotels_copy + ( + hotel_id, + hotel__name + ) + VALUES + ( + {0}, + '{1}' + ) + """ + +insert_tourist_query = """ + INSERT INTO tourists_copy + ( + tourist_id, + tourist_first_name, + hotel_id + ) + VALUES + ( + {0}, + '{1}', + {2} + ) + """ + +# d = pd.read_csv('toursit_hotel.csv', sep=',') +# hotels_inserted = set() +# for item in zip(d.tourist_id, d.tourist_name, d.hotel_id, d.hotel_name): +# if not item[2] in hotels_inserted: +# hotel_insert = insert_hotel_query.format(item[2], item[3]) +# cursor.execute(hotel_insert) +# conn.commit() +# hotels_inserted.add(item[2]) +# tourist_insert = insert_tourist_query.format(item[0], item[1], item[2]) +# cursor.execute(tourist_insert) +# conn.commit() + + +f = open(filename) +reader = csv.reader(f) +hotel_id = next(reader)[1] +name = next(reader)[1] +query = insert_hotel_query.format(hotel_id, name) +cursor.execute(query) +next(reader) +next(reader) + +for item in reader: + cursor.execute(insert_tourist_query.format(*item)) +conn.commit() diff --git a/km52/Stetsenko_Vladyslav/vizualization.py b/km52/Stetsenko_Vladyslav/vizualization.py index 1b7bb1f8..16b67baf 100644 --- a/km52/Stetsenko_Vladyslav/vizualization.py +++ b/km52/Stetsenko_Vladyslav/vizualization.py @@ -115,6 +115,4 @@ def get_tourists_count_per_hotel(self): "labels": x, "values": y } - vizualizator.pie(**data) - - + vizualizator.pie(**data) \ No newline at end of file From a39341d34f9a6eca3eb4a0f346e9e39b7a603296 Mon Sep 17 00:00:00 2001 From: Vlad Stetsenko Date: Sat, 2 Jun 2018 11:50:46 +0300 Subject: [PATCH 4/5] Update laboratory5.sql --- km52/Stetsenko_Vladyslav/laboratory5.sql | 39 ++++++++++++++++++++++-- 1 file changed, 37 insertions(+), 2 deletions(-) diff --git a/km52/Stetsenko_Vladyslav/laboratory5.sql b/km52/Stetsenko_Vladyslav/laboratory5.sql index 521e529d..c46adb45 100644 --- a/km52/Stetsenko_Vladyslav/laboratory5.sql +++ b/km52/Stetsenko_Vladyslav/laboratory5.sql @@ -1,2 +1,37 @@ --- LABORATORY WORK 5 --- BY Stetsenko_Vladyslav +CREATE function get_item_count(in vendor_id number) +return number +IS +prod_count number; +BEGIN +SELECT COUNT(PROD_ID) into prod_count FROM Product where VEND_ID=VENDOR_ID; +return prod_count; +END + +CREATE Procedure get_vend_id(in vend_name varchar, out vendor_id number) +BEGIN +SELECT NVL(VEND_ID, 0) FROM Vendors Where VEND_NAME=vend_name; +IF vendor_id==0 +Then +raise_application_error(-2001, "Vendor doesnt exist"); +END +END + +CREATE Procedute update_price(in price number, in product_id number) +IS +prod_exist number; +order_exist number; +BEGIN +Select NVL(prod_id, 0) into prod_exist FROM Products Where prod_id=product_id; +if prod_exist==0 +then +raise_application_error(-2002, "Product does not exist") +END +SELECT NVL(ORDER_NUM, 0) into ored_exist From OrderItems Where PROD_ID=product_id; +if order_exist +then +raise_application_error(-2002, "For this product exists order") +END +update Product +set PROD_PRICE=price +where PROD_ID=product_id +END From ebf31dba46b5974d2352afb46e8928fb8ec4e81b Mon Sep 17 00:00:00 2001 From: Vlad Stetsenko Date: Fri, 8 Jun 2018 21:35:57 +0300 Subject: [PATCH 5/5] Update laboratory4.sql --- km52/Stetsenko_Vladyslav/laboratory4.sql | 35 ++++++++++++++++++++++-- 1 file changed, 33 insertions(+), 2 deletions(-) diff --git a/km52/Stetsenko_Vladyslav/laboratory4.sql b/km52/Stetsenko_Vladyslav/laboratory4.sql index af924e4e..22860e59 100644 --- a/km52/Stetsenko_Vladyslav/laboratory4.sql +++ b/km52/Stetsenko_Vladyslav/laboratory4.sql @@ -1,2 +1,33 @@ --- LABORATORY WORK 4 --- BY Stetsenko_Vladyslav +CREATE TRIGGER hotel_created +AFTER CREATE ON Hotel +BEGIN +INSERT INTO STAFF (country, city, name, hotel_id, description) VALUES ("UA", "BC", "Manangment", new.hotel_id, "Manangment"); +END + +CREATE TRIGGER raiting_changed +AFTER UPDATE ON Hotel +BEGIN +IF old.rating>new.rating Then + DELETE FROM Tourist + WHERE Tourist.hotel_id=new.hotel_id; +END IF +END + +CREATE PROCEDURE get_staff_ingo(IN hotel_name varchar) +DECLARE + staff_count number; + CURSOR c1 + IS + SELECT STAFF.country, STAFF.city, STAFF.description + FROM Hotel JOIN STAFF on Hotel.hotel_id=STAFF.hotel_id WHERE Hotel.name=hotel_name; +BEGIN + SELECT count(STAFF.name) INTO staff_count + FROM Hotel JOIN STAFF on Hotel.hotel_id=STAFF.hotel_id WHERE Hotel.name=hotel_name; + dbms_output.putline(staff_count) + FOR record in c1 LOOP + dbms_output.putline(record.country) + dbms_output.putline(record.city) + dbms_output.putline(record.name) + dbms_output.putline(record.description) + END LOOP +END