Download as pdf or txt
Download as pdf or txt
You are on page 1of 6

Assignment – 3

Kishan Maniyar
COSC2307Q

Part 1 :-
create database Info;

CREATE TABLE CUSTOMER (


c_custkey INT,
c_name VARCHAR(50),
c_acctbal DECIMAL(10, 2),
c_nationkey INT,
PRIMARY KEY (c_custkey)
);

INSERT INTO CUSTOMER (c_custkey, c_name, c_acctbal, c_nationkey)


VALUES
(1, 'Customer1', 7000, 1),
(2, 'Customer2', 5000, 2),
(3, 'Customer3', 10000, 3),
(4, 'Customer4', 6000, 1);

CREATE TABLE NATION (


n_nationkey INT,
n_name VARCHAR(50),
n_regionkey INT,
PRIMARY KEY (n_nationkey)
);

-- Insert sample data into NATION table


INSERT INTO NATION (n_nationkey, n_name, n_regionkey)
VALUES
(1, 'France', 1),
(2, 'Germany', 1),
(3, 'Japan', 2),
(4, 'China', 2);

CREATE TABLE REGION (


r_regionkey INT,
r_name VARCHAR(50),
PRIMARY KEY (r_regionkey)
);

-- Insert sample data into REGION table


INSERT INTO REGION (r_regionkey, r_name)
VALUES
(1, 'Europe'),
(2, 'Asia');

CREATE TABLE SUPPLIER (


s_suppkey INT,
s_name VARCHAR(50),
s_nationkey INT,
PRIMARY KEY (s_suppkey)
);

-- Insert sample data into SUPPLIER table


INSERT INTO SUPPLIER (s_suppkey, s_name, s_nationkey)
VALUES
(1, 'Supplier1', 1),
(2, 'Supplier2', 2),
(3, 'Supplier3', 3);

CREATE TABLE PARTSUPP (


ps_partkey INT,
ps_suppkey INT,
PRIMARY KEY (ps_partkey, ps_suppkey)
);

-- Insert sample data into PARTSUPP table


INSERT INTO PARTSUPP (ps_partkey, ps_suppkey)
VALUES
(1, 1),
(2, 1),
(3, 2),
(4, 2),
(5, 3),
(6, 3);

CREATE TABLE LINEITEM (


l_orderkey INT,
l_partkey INT,
l_shipmode VARCHAR(50),
l_commitdate DATE,
l_shipdate DATE,
l_quantity INT,
l_discount DECIMAL(5,2),
PRIMARY KEY (l_orderkey, l_partkey) -- Assuming these are the primary keys
);

-- Insert sample data into LINEITEM table


INSERT INTO LINEITEM (l_orderkey, l_partkey, l_shipmode, l_commitdate, l_shipdate,
l_quantity, l_discount)
VALUES
(1, 1, 'TRUCK', '2024-03-01', '2024-03-05', 10, 0.1),
(2, 2, 'AIR', '2024-03-02', '2024-03-06', 20, 0.2),
(3, 3, 'TRUCK', '2024-03-03', '2024-03-07', 15, 0),
(4, 4, 'SHIP', '2024-03-04', '2024-03-08', 5, 0.15),
(5, 5, 'TRUCK', '2024-03-05', '2024-03-09', 12, 0),
(6, 6, 'RAIL', '2024-03-06', '2024-03-10', 8, 0.25);

CREATE TABLE ORD (


o_orderkey INT,
o_custkey INT,
o_totalprice DECIMAL(10, 2),
PRIMARY KEY (o_orderkey)
);
-- Insert sample data into ORDERS table
INSERT INTO ORD (o_orderkey, o_custkey, o_totalprice)
VALUES
(1, 1, 1000),
(2, 2, 2000),
(3, 3, 1500),
(4, 4, 1200),
(5, 1, 1800),
(6, 2, 2200);

CREATE TABLE PART (


p_partkey INT,
p_name VARCHAR(50),
p_size INT,
p_discount DECIMAL(5,2),
PRIMARY KEY (p_partkey)
);

-- Insert sample data into PART table


INSERT INTO PART (p_partkey, p_name, p_size, p_discount)
VALUES
(1, 'Part1', 30, 0.1),
(2, 'Part2', 35, 0.2),
(3, 'Part3', 45, 0),
(4, 'Part4', 25, 0.15),
(5, 'Part5', 40, 0),
(6, 'Part6', 50, 0.25);

1. How many European customers have a balance that is less than $8000.

SELECT COUNT(*) AS european_customers_with_balance_less_than_8000


FROM CUSTOMER c
WHERE c.c_nationkey IN (
SELECT n.n_nationkey
FROM NATION n
JOIN REGION r ON n.n_regionkey = r.r_regionkey
WHERE r.r_name = 'Europe'
)
AND c.c_acctbal < 8000;

OUTPUT:

2. Which region (Aisa, Europe...) supplies the most distinct parts.

SELECT TOP 1 r.r_name AS region_with_most_distinct_parts


FROM REGION r
JOIN NATION n ON r.r_regionkey = n.n_regionkey
JOIN SUPPLIER s ON n.n_nationkey = s.s_nationkey
JOIN PARTSUPP ps ON s.s_suppkey = ps.ps_suppkey
GROUP BY r.r_name
ORDER BY COUNT(DISTINCT ps.ps_partkey) DESC;
OUTPUT:

3. What is the average time for shipping items by TRUCK. FOLLOW UP. List the quantity and orderkey of all
the items shipped by TRUCK which takes less than the above time.
WITH TruckShippingAverage AS (
SELECT AVG(DATEDIFF(day, l_commitdate, l_shipdate)) AS average_time
FROM LINEITEM
WHERE l_shipmode = 'TRUCK'
)
SELECT l_orderkey, l_quantity
FROM LINEITEM
WHERE l_shipmode = 'TRUCK'
AND DATEDIFF(day, l_commitdate, l_shipdate) < (SELECT average_time FROM
TruckShippingAverage);

OUTPUT:

4. List all the items which have NO discount and not sold to customer in EUROPE.

SELECT *
FROM LINEITEM li
WHERE li.l_discount = 0
AND NOT EXISTS (
SELECT 1
FROM ORD o
JOIN CUSTOMER c ON o.o_custkey = c.c_custkey
JOIN NATION n ON c.c_nationkey = n.n_nationkey
JOIN REGION r_sub ON n.n_regionkey = r_sub.r_regionkey
WHERE o.o_orderkey = li.l_orderkey
AND r_sub.r_name = 'Europe'

);

OUTPUT:
5. List name(s) of the customer(s) who has not place any orders.

SELECT c_name
FROM CUSTOMER
WHERE c_custkey NOT IN (
SELECT DISTINCT o_custkey
FROM ORD

);

OUTPUT:

6. List the (distinct) items which are ordered by the customers from the country where suppliers have the
highest average balance.
SELECT DISTINCT p.p_name
FROM PART p
JOIN LINEITEM li ON p.p_partkey = li.l_partkey
JOIN ORD o ON li.l_orderkey = o.o_orderkey
JOIN CUSTOMER c ON o.o_custkey = c.c_custkey
JOIN NATION n ON c.c_nationkey = n.n_nationkey
JOIN (
SELECT TOP 1 s.s_suppkey, ps.p_suppkey
FROM SUPPLIER s
JOIN PARTSUPP ps ON s.s_suppkey = ps.ps_suppkey
GROUP BY s.s_suppkey, ps.p_suppkey
ORDER BY AVG(s.s_balance) DESC
) AS max_balance_supplier ON p.p_suppkey = max_balance_supplier.p_suppkey;

OUTPUT:

7. Find the average price of all the orders which contain no parts with size larger than 40.

SELECT AVG(o_totalprice) AS average_price


FROM ORD o
WHERE NOT EXISTS (
SELECT 1
FROM LINEITEM li
JOIN PART p ON li.l_partkey = p.p_partkey
WHERE li.l_orderkey = o.o_orderkey
AND p.p_size > 40

);
OUTPUT:

8. List the name of the suppliers which supplies more than 5 parts along with the number of parts their
supplied.

SELECT s.s_name, COUNT(DISTINCT ps.ps_partkey) AS parts_supplied


FROM SUPPLIER s
JOIN PARTSUPP ps ON s.s_suppkey = ps.ps_suppkey
GROUP BY s.s_name

HAVING COUNT(DISTINCT ps.ps_partkey) > 5;

OUTPUT:

9. Find the names of all the distinct parts which receive the highest discount.

SELECT p_name
FROM PART
WHERE p_discount = (
SELECT MAX(p_discount)
FROM PART

);

OUTPUT:

You might also like