-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathsql.py
127 lines (115 loc) Β· 4.07 KB
/
sql.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
import streamlit as st
import mysql.connector
import pandas as pd
import plotly.express as px
# π Function to Connect to MySQL Database
def get_db_connection():
try:
conn = mysql.connector.connect(
host="gateway01.ap-southeast-1.prod.aws.tidbcloud.com",
user="7Z3SRE1xmB2xsHv.root",
password="593g7sDIAPe2H7Og",
database="PROJECT_1"
)
return conn
except mysql.connector.Error as err:
st.error(f"Database connection failed: {err}")
return None
# π SQL Queries Dictionary (More Queries Added)
queries = {
"π Peak Order Hours": """
SELECT HOUR(order_datetime) AS hour, COUNT(*) AS total_orders
FROM orders
GROUP BY hour
ORDER BY total_orders DESC;
""",
"π½οΈ Most Ordered Cuisine Type": """
SELECT r.cuisine_type, COUNT(*) AS total_orders
FROM orders o
JOIN restaurants r ON o.restaurant_id = r.restaurant_id
GROUP BY r.cuisine_type
ORDER BY total_orders DESC;
""",
"π Top 10 Restaurants": """
SELECT r.name, COUNT(*) AS total_orders
FROM orders o
JOIN restaurants r ON o.restaurant_id = r.restaurant_id
GROUP BY r.name
ORDER BY total_orders DESC
LIMIT 10;
""",
"π° Average Order Value": """
SELECT AVG(total_amount) AS avg_order_value FROM orders;
""",
"π Average Delivery Time": """
SELECT AVG(TIMESTAMPDIFF(MINUTE, o.order_datetime, d.delivery_time)) AS avg_delivery_time
FROM orders o
JOIN delivery d ON o.order_id = d.order_id
WHERE d.status = 'Delivered';
""",
"π
Daily Order Trend": """
SELECT DATE(order_datetime) AS order_date, COUNT(*) AS total_orders
FROM orders
GROUP BY order_date
ORDER BY order_date;
""",
"π΅ Most Active Delivery Agents": """
SELECT d.delivery_agent, COUNT(*) AS deliveries
FROM delivery d
GROUP BY d.delivery_agent
ORDER BY deliveries DESC
LIMIT 5;
""",
"ποΈ Cities with Most Orders": """
SELECT c.city, COUNT(*) AS total_orders
FROM customers c
JOIN orders o ON c.customer_id = o.customer_id
GROUP BY c.city
ORDER BY total_orders DESC;
""",
"π₯ Most Frequent Customers": """
SELECT c.name, COUNT(*) AS total_orders
FROM customers c
JOIN orders o ON c.customer_id = o.customer_id
GROUP BY c.name
ORDER BY total_orders DESC
LIMIT 10;
""",
"β‘ Fastest Delivered Orders": """
SELECT o.order_id, TIMESTAMPDIFF(MINUTE, o.order_datetime, d.delivery_time) AS delivery_time
FROM orders o
JOIN delivery d ON o.order_id = d.order_id
WHERE d.status = 'Delivered'
ORDER BY delivery_time ASC
LIMIT 5;
"""
}
# π¨ Streamlit UI Design
st.title("π Zomato - Food Delivery Insights")
st.write("Select a query to analyze food delivery trends.")
# π User selects a query
query_name = st.selectbox("Choose a Query", list(queries.keys()))
# π Run Query Button
if st.button("Run Query"):
conn = get_db_connection()
if conn:
cursor = conn.cursor()
try:
cursor.execute(queries[query_name])
data = cursor.fetchall()
columns = [i[0] for i in cursor.description] # Fetch column names
df = pd.DataFrame(data, columns=columns)
# π Display Data
st.dataframe(df)
# π Generate Bar Chart for Visual Queries
if len(df) > 0:
fig = px.bar(df, x=df.columns[0], y=df.columns[1], title=query_name, text_auto=True)
st.plotly_chart(fig)
# π₯ Download as CSV
csv = df.to_csv(index=False).encode('utf-8')
st.download_button("Download CSV", csv, f"{query_name}.csv", "text/csv")
except mysql.connector.Error as err:
st.error(f"SQL Execution Error: {err}")
finally:
cursor.close()
conn.close()