Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
40 changes: 40 additions & 0 deletions km52/Stetsenko_Vladyslav/export_csv.py
Original file line number Diff line number Diff line change
@@ -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()
62 changes: 62 additions & 0 deletions km52/Stetsenko_Vladyslav/import_csv.py
Original file line number Diff line number Diff line change
@@ -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()
31 changes: 29 additions & 2 deletions km52/Stetsenko_Vladyslav/laboratory2.sql
Original file line number Diff line number Diff line change
@@ -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;
47 changes: 45 additions & 2 deletions km52/Stetsenko_Vladyslav/laboratory3.sql
Original file line number Diff line number Diff line change
@@ -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;



35 changes: 33 additions & 2 deletions km52/Stetsenko_Vladyslav/laboratory4.sql
Original file line number Diff line number Diff line change
@@ -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
39 changes: 37 additions & 2 deletions km52/Stetsenko_Vladyslav/laboratory5.sql
Original file line number Diff line number Diff line change
@@ -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
118 changes: 118 additions & 0 deletions km52/Stetsenko_Vladyslav/vizualization.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,118 @@
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)