Business Report - Suchita - Bhovar - SQL
Business Report - Suchita - Bhovar - SQL
1.1 Query 1 3
2.1 Query 2 4
3.1 Query 3 5
4.1 Query 4 6
5.1 Query 5 7
6.1 Query 6 8
7.1 Query 7 9
9.1 Query 9 16
10.1 Query 10 17
1. WRITE A QUERY TO DISPLAY CUSTOMER FULL NAME WITH THEIR TITLE
(MR/MS), BOTH FIRST NAME AND LAST NAME ARE IN UPPER CASE WITH
-- CUSTOMER EMAIL ID, CUSTOMER CREATIONDATE AND DISPLAY
CUSTOMER’S CATEGORY AFTER APPLYING BELOW CATEGORIZATION
RULES:
-- i.IF CUSTOMER CREATION DATE YEAR <2005 THEN CATEGORY A
-- ii.IF CUSTOMER CREATION DATE YEAR >=2005 AND <2011 THEN
CATEGORY B
-- iii.IF CUSTOMER CREATION DATE YEAR>= 2011 THEN CATEGORY C
-- HINT: USE CASE STATEMENT, NO PERMANENT CHANGE IN TABLE
REQUIRED. [NOTE: TABLES TO BE USED -ONLINE_CUSTOMER TABLE
Solution 1: -
use orders;
select concat(case CUSTOMER_GENDER when 'M' then 'Mr.' when 'F' then 'Ms.' end ,'
',upper(CUSTOMER_FNAME),' ' ,upper(CUSTOMER_LNAME) ) as
Customer_full_name,CUSTOMER_EMAIL,CUSTOMER_CREATION_DATE,
case when year(CUSTOMER_CREATION_DATE)<2005 then 'A'
when 2005<=year(CUSTOMER_CREATION_DATE) and
year(CUSTOMER_CREATION_DATE)<2011 then 'B'
else 'C'
end as Customers_Category from online_customer;
Output 1: -
Table 1.1 (Query 1)
2. WRITE A QUERY TO DISPLAY THE FOLLOWING INFORMATION FOR THE
PRODUCTS, WHICH HAVE NOT BEEN SOLD: PRODUCT_ID, PRODUCT_DESC,
-- PRODUCT_QUANTITY_AVAIL, PRODUCT_PRICE,INVENTORY
VALUES(PRODUCT_QUANTITY_AVAIL*PRODUCT_PRICE), NEW_PRICE
AFTER APPLYING DISCOUNT
-- AS PER BELOW CRITERIA. SORT THE OUTPUT WITH RESPECT TO
DECREASING VALUE OF INVENTORY_VALUE.
-- i.IF PRODUCT PRICE > 20,000 THEN APPLY 20% DISCOUNT
-- ii.IF PRODUCT PRICE > 10,000 THEN APPLY 15% DISCOUNT
-- iii.IF PRODUCT PRICE =< 10,000 THEN APPLY 10% DISCOUNT
Solution 2: -
use orders;
show tables;
select * from product
select product_id, product_desc,product_quantity_avail, product_price,
(product_quantity_avail*product_price) as inventory_values,
case when product_price > 200000 then (product_price*20)/100
when product_price > 100000 then (product_price*15)/100
when product_price <= 100000 then (product_price*10)/100
end as New_Price from product
order by inventory_values desc;
Output 2: -
Table 2.1 (Query 2)
3. WRITE A QUERY TO DISPLAY PRODUCT_CLASS_CODE,
PRODUCT_CLASS_DESCRIPTION, COUNT OF PRODUCT TYPE IN EACH
PRODUCT CLASS,
-- INVENTORY VALUE (P.PRODUCT_QUANTITY_AVAIL*P.PRODUCT_PRICE).
INFORMATION SHOULD BE DISPLAYED FOR ONLY THOSE
PRODUCT_CLASS_CODE
-- WHICH HAVE MORE THAN 1,00,000 INVENTORY VALUE. SORT THE OUTPUT
WITH RESPECT TO DECREASING VALUE OF INVENTORY_VALUE.
-- [NOTE: TABLES TO BE USED -PRODUCT, PRODUCT_CLASS]
Solution 3: -
use orders;
select pc.PRODUCT_CLASS_CODE as Product_class_code, pc.PRODUCT_CLASS_DESC
as Product_class_description,
sum(p.PRODUCT_QUANTITY_AVAIL * p.PRODUCT_PRICE) as Inventory_Value,
count( pc.PRODUCT_CLASS_CODE ) as countof_product_type
from orders.PRODUCT p
left join orders.PRODUCT_CLASS pc on p.PRODUCT_CLASS_CODE =
pc.PRODUCT_CLASS_CODE
group BY pc.PRODUCT_CLASS_CODE having Inventory_Value > 100000
order BY Inventory_Value DESC;
Output 3: -
Table 3.1 (Query 3)
4. WRITE A QUERY TO DISPLAY CUSTOMER_ID, FULL NAME,
CUSTOMER_EMAIL, CUSTOMER_PHONE AND COUNTRY OF CUSTOMERS
WHO HAVE CANCELLED
-- ALL THE ORDERS PLACED BY THEM(USE SUB-QUERY)
-- [NOTE: TABLES TO BE USED - ONLINE_CUSTOMER, ADDRESSS,
ORDER_HEADER]
Solution 4: -
select o.customer_id,concat(upper(o.customer_fname),' ',upper(o.customer_lname))
Full_Name,o.customer_email, o.customer_phone,a.country from online_customer
o inner join address a using (Address_id) inner join order_header using (customer_id) where
Order_status= 'Cancelled';
Output 4: -
Table 4.1 (Query 4)
5. WRITE A QUERY TO DISPLAY SHIPPER NAME, CITY TO WHICH IT IS
CATERING, NUMBER OF CUSTOMER CATERED BY THE SHIPPER IN THE
CITY AND
-- NUMBER OF CONSIGNMENTS DELIVERED TO THAT CITY FOR SHIPPER
DHL(9 ROWS)
-- [NOTE: TABLES TO BE USED -SHIPPER, ONLINE_CUSTOMER,
ADDRESSS, ORDER_HEADER]
Solution 5: -
select B.SHIPPER_NAME, B.CITY, Count(Distinct A.CUSTOMER_ID)
CUSTOMER_COUN from ORDER_HEADER A,
(select A.SHIPPER_NAME, A.SHIPPER_ID, B.City, B.ADDRESS_ID from SHIPPER A,
ADDRESS B
where A.SHIPPER_ADDRESS = B.ADDRESS_ID and A.SHIPPER_NAME = 'DHL') B
where A.SHIPPER_ID = B.SHIPPER_ID Group by B.SHIPPER_NAME,B.City;
Output 5:-
Table 5.1 (Query 5)
6. WRITE A QUERY TO DISPLAY CUSTOMER ID, CUSTOMER FULL NAME,
TOTAL QUANTITY AND TOTAL VALUE (QUANTITY*PRICE) SHIPPED WHERE
MODE
-- OF PAYMENT IS CASH AND CUSTOMER LAST NAME STARTS WITH 'G'
-- [NOTE: TABLES TO BE USED -ONLINE_CUSTOMER, ORDER_ITEMS,
PRODUCT, ORDER_HEADER]
Solution 6: -
select * from ORDER_ITEMS; select* from ORDER_HEADER; select
OC.CUSTOMER_ID,concat(OC.CUSTOMER_FNAME,' ',OC.CUSTOMER_LNAME) as
FULL_NAME,
count(OI.PRODUCT_QUANTITY) as TOTAL_QUANTITY,
sum(OI.PRODUCT_QUANTITY * P.PRODUCT_PRICE) as TOTAL_VALUE from
ONLINE_CUSTOMER OC
inner join ORDER_HEADER OH using (CUSTOMER_ID) inner join ORDER_ITEMS OI
using(ORDER_ID) inner join PRODUCT P
using (PRODUCT_ID) where ORDER_STATUS = 'Shipped' and payment_mode='Cash' and
CUSTOMER_LNAME like 'G%' group by CUSTOMER_ID;
Output 6:-
Table 6.1 (Query 6)
QUESTION NO. 7Write a query to display order_id and volume of the biggest order (in
terms of volume) that can fit in
-- carton id 10
Solution 7: -
select * from carton;
WITH ORDER_VOLUME as (SELECT ORDER_ITEMS.ORDER_ID, (PRODUCT.LEN *
PRODUCT.WIDTH * PRODUCT.HEIGHT)
VOLUME FROM ORDER_ITEMS JOIN PRODUCT ON PRODUCT.PRODUCT_ID =
ORDER_ITEMS.PRODUCT_ID), carton_10_volume as (SELECT(CARTON.LEN *
CARTON.WIDTH * CARTON.HEIGHT) CARTON_10_VOLUME FROM CARTON
WHERE CARTON_ID = 10)
SELECT ORDER_VOLUME.ORDER_ID, ORDER_VOLUME.VOLUME FROM
ORDER_VOLUME,carton_10_volume
WHERE ORDER_VOLUME.VOLUME <= carton_10_volume.CARTON_10_VOLUME
ORDER BY ORDER_VOLUME.VOLUME DESC limit 1;
Output 7:-
Table 7.1 (Query 7)
8. WRITE A QUERY TO DISPLAY PRODUCT_ID, PRODUCT_DESC,
PRODUCT_QUANTITY_AVAIL, QUANTITY SOLD, AND SHOW INVENTORY
STATUS OF
-- PRODUCTS AS BELOW AS PER BELOW CONDITION:
-- A.FOR ELECTRONICS AND COMPUTER CATEGORIES,
-- i.IF SALES TILL DATE IS ZERO THEN SHOW 'NO SALES IN
PAST, GIVE DISCOUNT TO REDUCE INVENTORY',
-- ii.IF INVENTORY QUANTITY IS LESS THAN 10% OF QUANTITY SOLD,
SHOW 'LOW INVENTORY, NEED TO ADD INVENTORY',
-- iii.IF INVENTORY QUANTITY IS LESS THAN 50% OF QUANTITY SOLD,
SHOW 'MEDIUM INVENTORY, NEED TO ADD SOME INVENTORY',
-- iv.IF INVENTORY QUANTITY IS MORE OR EQUAL TO 50% OF
QUANTITY SOLD, SHOW 'SUFFICIENT
INVENTORY'PRODUCT_IDPRODUCT_DESCPRODUCT_CLASS_CODEPRODUC
T_PRICEPRODUCT_QUANTITY_AVAIL
Solution 8(a): -
SELECT
P.PRODUCT_DESC,
PC.PRODUCT_CLASS_DESC,
P.PRODUCT_QUANTITY_AVAIL,
COUNT(OI.PRODUCT_QUANTITY) AS SOLD_QUANTITY,
(P.PRODUCT_QUANTITY_AVAIL / (P.PRODUCT_QUANTITY_AVAIL +
COUNT(OI.PRODUCT_QUANTITY))) * 100 AS AVAILABLE_QTY_PRC,
CASE
WHEN (P.PRODUCT_QUANTITY_AVAIL / (P.PRODUCT_QUANTITY_AVAIL +
COUNT(OI.PRODUCT_QUANTITY))) * 100 < 10 THEN 'Low inventory, need to add
inventory'
WHEN (P.PRODUCT_QUANTITY_AVAIL / (P.PRODUCT_QUANTITY_AVAIL +
COUNT(OI.PRODUCT_QUANTITY))) * 100 < 50 THEN 'Medium inventory, need to add
some inventory'
WHEN (P.PRODUCT_QUANTITY_AVAIL / (P.PRODUCT_QUANTITY_AVAIL +
COUNT(OI.PRODUCT_QUANTITY))) * 100 >= 50 THEN 'Sufficient inventory'
ELSE 'No sales in past, give discount to reduce inventory'
END AS INVENTORY_STATUS
FROM
PRODUCT_CLASS PC
INNER JOIN
PRODUCT P ON P.PRODUCT_CLASS_CODE = PC.PRODUCT_CLASS_CODE
INNER JOIN
ORDER_ITEMS OI ON OI.PRODUCT_ID = P.PRODUCT_ID
INNER JOIN
ORDER_HEADER OH ON OH.ORDER_ID = OI.ORDER_ID
WHERE
PC.PRODUCT_CLASS_DESC IN ('Electronics', 'Computer')
AND OH.ORDER_STATUS = 'Shipped'
GROUP BY
P.PRODUCT_DESC,
PC.PRODUCT_CLASS_DESC,
P.PRODUCT_QUANTITY_AVAIL;
Output 8(a):-
Table 8.1 (Query 8(a))
Question No. 8 (b)
B. FOR MOBILES AND WATCHES CATEGORIES,
-- i.IF SALES TILL DATE IS ZERO THEN SHOW 'NO SALES IN PAST,
GIVE DISCOUNT TO REDUCE INVENTORY',
-- ii.IF INVENTORY QUANTITY IS LESS THAN 20% OF QUANTITY SOLD,
SHOW 'LOW INVENTORY, NEED TO ADD INVENTORY',
-- iii.IF INVENTORY QUANTITY IS LESS THAN 60% OF QUANTITY SOLD,
SHOW 'MEDIUM INVENTORY, NEED TO ADD SOME INVENTORY',
-- iv.IF INVENTORY QUANTITY IS MORE OR EQUAL TO 60% OF QUANTITY
SOLD, SHOW 'SUFFICIENT INVENTORY'
Solution 8(b): -
SELECT
P.PRODUCT_DESC,
PC.PRODUCT_CLASS_DESC,
P.PRODUCT_QUANTITY_AVAIL,
COUNT(OI.PRODUCT_QUANTITY) AS SOLD_QUANTITY,
(P.PRODUCT_QUANTITY_AVAIL / (P.PRODUCT_QUANTITY_AVAIL +
COUNT(OI.PRODUCT_QUANTITY))) * 100 AS AVAILABLE_QTY_PRC,
CASE
WHEN (P.PRODUCT_QUANTITY_AVAIL / (P.PRODUCT_QUANTITY_AVAIL +
COUNT(OI.PRODUCT_QUANTITY))) * 100 < 20 THEN 'Low inventory, need to add
inventory'
WHEN (P.PRODUCT_QUANTITY_AVAIL / (P.PRODUCT_QUANTITY_AVAIL +
COUNT(OI.PRODUCT_QUANTITY))) * 100 < 60 THEN 'Medium inventory, need to add
some inventory'
WHEN (P.PRODUCT_QUANTITY_AVAIL / (P.PRODUCT_QUANTITY_AVAIL +
COUNT(OI.PRODUCT_QUANTITY))) * 100 >= 60 THEN 'Sufficient inventory'
ELSE 'No sales in past, give discount to reduce inventory'
END AS INVENTORY_STATUS
FROM
PRODUCT_CLASS PC
INNER JOIN
PRODUCT P ON P.PRODUCT_CLASS_CODE = PC.PRODUCT_CLASS_CODE
INNER JOIN
ORDER_ITEMS OI ON OI.PRODUCT_ID = P.PRODUCT_ID
INNER JOIN
ORDER_HEADER OH ON OH.ORDER_ID = OI.ORDER_ID
WHERE
PC.PRODUCT_CLASS_DESC IN ('Mobiles', 'Watches')
AND OH.ORDER_STATUS = 'Shipped'
GROUP BY
P.PRODUCT_DESC,
PC.PRODUCT_CLASS_DESC,
P.PRODUCT_QUANTITY_AVAIL;
Output 8(b):-
Table 8.2 (Query 8 (b))
C.REST OF THE CATEGORIES,
-- i.IF SALES TILL DATE IS ZERO THEN SHOW 'NO SALES IN
PAST, GIVE DISCOUNT TO REDUCE INVENTORY',
-- ii.IF INVENTORY QUANTITY IS LESS THAN 30% OF QUANTITY SOLD,
SHOW 'LOW INVENTORY, NEED TO ADD INVENTORY',
-- iii.IF INVENTORY QUANTITY IS LESS THAN 70% OF QUANTITY SOLD,
SHOW 'MEDIUM INVENTORY, NEED TO ADD SOME INVENTORY',
-- iv. IF INVENTORY QUANTITY IS MORE OR EQUAL TO 70% OF
QUANTITY SOLD, SHOW 'SUFFICIENT INVENTORY'
-- [NOTE: TABLES TO BE USED -PRODUCT, PRODUCT_CLASS,
ORDER_ITEMS] (USE SUB-QUERY)
Solution 8(c): -
select * from product_class
SELECT
P.PRODUCT_DESC,
PC.PRODUCT_CLASS_DESC,
P.PRODUCT_QUANTITY_AVAIL,
COUNT(OI.PRODUCT_QUANTITY) AS SOLD_QUANTITY,
(P.PRODUCT_QUANTITY_AVAIL / (P.PRODUCT_QUANTITY_AVAIL +
COUNT(OI.PRODUCT_QUANTITY))) * 100 AS AVAILABLE_QTY_PRC,
CASE
WHEN (P.PRODUCT_QUANTITY_AVAIL / (P.PRODUCT_QUANTITY_AVAIL +
COUNT(OI.PRODUCT_QUANTITY))) * 100 < 30 THEN 'Low inventory, need to add
inventory'
WHEN (P.PRODUCT_QUANTITY_AVAIL / (P.PRODUCT_QUANTITY_AVAIL +
COUNT(OI.PRODUCT_QUANTITY))) * 100 < 70 THEN 'Medium inventory, need to add
some inventory'
WHEN (P.PRODUCT_QUANTITY_AVAIL / (P.PRODUCT_QUANTITY_AVAIL +
COUNT(OI.PRODUCT_QUANTITY))) * 100 >= 70 THEN 'Sufficient inventory'
ELSE 'No sales in past, give discount to reduce inventory'
END AS INVENTORY_STATUS
FROM
PRODUCT_CLASS PC
INNER JOIN
PRODUCT P ON P.PRODUCT_CLASS_CODE = PC.PRODUCT_CLASS_CODE
INNER JOIN
ORDER_ITEMS OI ON OI.PRODUCT_ID = P.PRODUCT_ID
INNER JOIN
ORDER_HEADER OH ON OH.ORDER_ID = OI.ORDER_ID
WHERE
PC.PRODUCT_CLASS_DESC IN ('Toys', 'Clothes','Books','Furnitures','Bags','Kitchen
Items')
AND OH.ORDER_STATUS = 'Shipped'
GROUP BY
P.PRODUCT_DESC,
PC.PRODUCT_CLASS_DESC,
P.PRODUCT_QUANTITY_AVAIL;
Output 8(c):-
Table 8.3 (Query 8 (c))
9. WRITE A QUERY TO DISPLAY PRODUCT_ID, PRODUCT_DESC AND TOTAL
QUANTITY OF PRODUCTS WHICH ARE SOLD TOGETHER WITH PRODUCT ID 201
-- AND ARE NOT SHIPPED TO CITY BANGALORE AND NEW DELHI. DISPLAY THE
OUTPUT IN DESCENDING ORDER WITH RESPECT TO TOT_QTY.(USE SUB-
QUERY)
-- [NOTE: TABLES TO BE USED -
ORDER_ITEMS,PRODUCT,ORDER_HEADER, ONLINE_CUSTOMER, ADDRESS]
Solution 9: -
select P.PRODUCT_ID, P.PRODUCT_DESC,A.CITY,Count(OI.PRODUCT_QUANTITY)
as Total_Quantity from PRODUCT P
inner join ORDER_ITEMS OI on OI.PRODUCT_ID = P.PRODUCT_ID
inner join ORDER_HEADER OH on OH.ORDER_ID = OI.ORDER_ID
inner join ONLINE_CUSTOMER OC on OC.CUSTOMER_ID = OH.CUSTOMER_ID
inner join ADDRESS A on A.ADDRESS_ID= OC.ADDRESS_ID
where P.PRODUCT_ID = OI.PRODUCT_ID and P.PRODUCT_ID = 201 and A.CITY not
in ('Bangalore','New Delhi')
Group by P.PRODUCT_ID, P.PRODUCT_DESC,A.CITY;
Output 9:-
Table 9.1 (Query 9)
10. WRITE A QUERY TO DISPLAY THE ORDER_ID,CUSTOMER_ID AND
CUSTOMER FULLNAME AND TOTAL QUANTITY OF PRODUCTS SHIPPED FOR
ORDER IDS
-- WHICH ARE EVENAND SHIPPED TO ADDRESS WHERE PINCODE IS NOT
STARTING WITH "5"
-- [NOTE: TABLES TO BE USED -
ONLINE_CUSTOMER,ORDER_HEADER, ORDER_ITEMS, ADDRESS]
Solution 10: -
select OI.ORDER_ID, OC.CUSTOMER_ID, concat(OC.CUSTOMER_FNAME,'
',OC.CUSTOMER_LNAME) as FULL_NAME,
sum(OI.PRODUCT_QUANTITY) as TOTAL_QUANTITY from ORDER_ITEMS OI
inner join ORDER_HEADER OH using (ORDER_ID)
inner join ONLINE_CUSTOMER OC using (CUSTOMER_ID)
inner join ADDRESS A using (ADDRESS_ID)
where ORDER_ID%2=0 and pincode not like '5%'
group by ORDER_ID;
Output 10:-
Table 10.1 (Query 10)