📚 SQL QUESTIONS AND ANSWERS
305 Comprehensive Questions Using CARSHOWROOM Database
📑 TABLE OF CONTENTS
SECTION 1: DATA DEFINITION LANGUAGE (DDL) Q1-Q15
Q1 Write the SQL command to create the INVENTORY table.
CREATE TABLE INVENTORY (
CarId VARCHAR(10) PRIMARY KEY,
CarName VARCHAR(20),
Price DECIMAL(10,2),
Model VARCHAR(10),
Year INT,
FuelType VARCHAR(10)
);
Q2 Write the SQL command to create the CUSTOMER table.
CREATE TABLE CUSTOMER (
CustId VARCHAR(10) PRIMARY KEY,
CustName VARCHAR(30),
CustAdd VARCHAR(50),
Phone VARCHAR(15),
Email VARCHAR(30)
);
Q3 Write the SQL command to create the SALE table with foreign keys.
CREATE TABLE SALE (
Invoiceno VARCHAR(10) PRIMARY KEY,
CarId VARCHAR(10),
CustId VARCHAR(10),
SaleDate DATE,
PaymentMode VARCHAR(15),
EmpID VARCHAR(10),
SalePrice DECIMAL(10,2),
FOREIGN KEY (CarId) REFERENCES INVENTORY(CarId),
FOREIGN KEY (CustId) REFERENCES CUSTOMER(CustId),
FOREIGN KEY (EmpID) REFERENCES EMPLOYEE(EmpID)
);
Q4 Write the SQL command to create the EMPLOYEE table.
CREATE TABLE EMPLOYEE (
EmpID VARCHAR(10) PRIMARY KEY,
EmpName VARCHAR(30),
DOB DATE,
DOJ DATE,
Designation VARCHAR(20),
Salary DECIMAL(8,2)
);
Q5 Write the command to add a column 'Commission' to the SALE table.
ALTER TABLE SALE ADD Commission DECIMAL(7,2);
Q6 Write the command to add a column 'Discount' to the INVENTORY table.
ALTER TABLE INVENTORY ADD Discount DECIMAL(5,2);
Q7 Write the command to modify the data type of Salary column to DECIMAL(10,2).
ALTER TABLE EMPLOYEE MODIFY Salary DECIMAL(10,2);
Q8 Write the command to rename the column 'CustAdd' to 'CustomerAddress'.
ALTER TABLE CUSTOMER CHANGE CustAdd CustomerAddress VARCHAR(50);
Q9 Write the command to drop the column 'Discount' from INVENTORY table.
ALTER TABLE INVENTORY DROP Discount;
Q10 Write the command to add a PRIMARY KEY constraint on CarId.
ALTER TABLE INVENTORY ADD PRIMARY KEY (CarId);
Q11 Write the command to add a FOREIGN KEY constraint on EmpID.
ALTER TABLE SALE ADD FOREIGN KEY (EmpID) REFERENCES EMPLOYEE(EmpID);
Q12 Write the command to add NOT NULL constraint on CustName.
ALTER TABLE CUSTOMER MODIFY CustName VARCHAR(30) NOT NULL;
Q13 Write the command to add UNIQUE constraint on Phone.
ALTER TABLE CUSTOMER ADD UNIQUE (Phone);
Q14 Write the command to set default value 'Cash' for PaymentMode.
ALTER TABLE SALE MODIFY PaymentMode VARCHAR(15) DEFAULT 'Cash';
Q15 Write the command to drop the PRIMARY KEY from CUSTOMER table.
ALTER TABLE CUSTOMER DROP PRIMARY KEY;
SECTION 2: DATA MANIPULATION LANGUAGE (INSERT) Q16-Q25
Q16 Insert a new car into INVENTORY table.
INSERT INTO INVENTORY VALUES ('S003', 'SWIFT', 650000, 'ZXI', 2019, 'Petrol');
Q17 Insert a new customer into CUSTOMER table.
INSERT INTO CUSTOMER VALUES ('C0005', 'Rahul Sharma', '15, Connaught Place, Delhi', '9876543210', 'rahul@gmail.com');
Q18 Insert a new sale record.
INSERT INTO SALE VALUES ('I00007', 'S003', 'C0005', '2020-01-15', 'Cash', 'E001', 620000);
Q19 Insert a new employee.
INSERT INTO EMPLOYEE VALUES ('E011', 'Priya Singh', '1992-05-10', '2020-01-01', 'Salesman', 30000);
Q20 Insert multiple cars into INVENTORY table at once.
INSERT INTO INVENTORY VALUES
('S004', 'WAGONR', 500000, 'LXI', 2020, 'Petrol'),
('S005', 'WAGONR', 550000, 'VXI', 2020, 'Petrol');
Q21 Insert a new customer with only CustId, CustName and Phone.
INSERT INTO CUSTOMER (CustId, CustName, Phone) VALUES ('C0006', 'Neha Gupta', '9988776655');
Q22 Insert a new sale without specifying InvoiceNo.
INSERT INTO SALE (CarId, CustId, SaleDate, PaymentMode, EmpID, SalePrice)
VALUES ('S001', 'C0001', '2020-01-20', 'Online', 'E004', 590321);
Q23 Insert a new employee with NULL value for Commission.
INSERT INTO EMPLOYEE (EmpID, EmpName, DOB, DOJ, Designation, Salary)
VALUES ('E012', 'Arun Kumar', '1990-08-15', '2019-12-01', 'Salesman', 28000);
Q24 Insert a record in SALE table with SalePrice as 0.
INSERT INTO SALE VALUES ('I00008', 'D002', 'C0002', '2020-01-25', 'Cheque', 'E007', 0);
Q25 Insert a car with Price NULL.
INSERT INTO INVENTORY (CarId, CarName, Model, Year, FuelType)
VALUES ('S006', 'ALTO', 'LXI', 2018, 'Petrol');
SECTION 3: SELECT STATEMENTS (BASIC) Q26-Q40
Q26 Display all records from the INVENTORY table.
SELECT * FROM INVENTORY;
Q27 Display only CarId, CarName and Price from INVENTORY.
SELECT CarId, CarName, Price FROM INVENTORY;
Q28 Display Customer Name and Phone from CUSTOMER table.
SELECT CustName, Phone FROM CUSTOMER;
Q29 Display Employee Name, Designation and Salary from EMPLOYEE.
SELECT EmpName, Designation, Salary FROM EMPLOYEE;
Q30 Display InvoiceNo, SaleDate and SalePrice from SALE.
SELECT Invoiceno, SaleDate, SalePrice FROM SALE;
Q31 Display all records from SALE table.
SELECT * FROM SALE;
Q32 Display distinct CarId from SALE table.
SELECT DISTINCT CarId FROM SALE;
Q33 Display distinct PaymentMode from SALE table.
SELECT DISTINCT PaymentMode FROM SALE;
Q34 Display distinct Model from INVENTORY.
SELECT DISTINCT Model FROM INVENTORY;
Q35 Display distinct FuelType from INVENTORY.
SELECT DISTINCT FuelType FROM INVENTORY;
Q36 Display CarName and Price with alias Car_Price.
SELECT CarName, Price AS Car_Price FROM INVENTORY;
Q37 Display EmpName as Employee_Name from EMPLOYEE.
SELECT EmpName AS Employee_Name FROM EMPLOYEE;
Q38 Display SalePrice as Selling_Price from SALE.
SELECT SalePrice AS Selling_Price FROM SALE;
Q39 Display all cars with price greater than 600000.
SELECT * FROM INVENTORY WHERE Price > 600000;
Q40 Display all employees with salary greater than 30000.
SELECT * FROM EMPLOYEE WHERE Salary > 30000;
SECTION 4: SELECT WITH WHERE CLAUSE Q41-Q55
Q41 Display cars with fuel type 'Petrol'.
SELECT * FROM INVENTORY WHERE FuelType = 'Petrol';
Q42 Display cars with model 'VXI'.
SELECT * FROM INVENTORY WHERE Model = 'VXI';
Q43 Display employees with designation 'Salesman'.
SELECT * FROM EMPLOYEE WHERE Designation = 'Salesman';
Q44 Display sales made through 'Credit Card'.
SELECT * FROM SALE WHERE PaymentMode = 'Credit Card';
Q45 Display cars with price between 500000 and 700000.
SELECT * FROM INVENTORY WHERE Price BETWEEN 500000 AND 700000;
Q46 Display employees with salary between 25000 and 35000.
SELECT * FROM EMPLOYEE WHERE Salary BETWEEN 25000 AND 35000;
Q47 Display cars made in 2018 and having fuel type 'Petrol'.
SELECT * FROM INVENTORY WHERE Year = 2018 AND FuelType = 'Petrol';
Q48 Display sales made by employee 'E007'.
SELECT * FROM SALE WHERE EmpID = 'E007';
Q49 Display customers whose name starts with 'A'.
SELECT * FROM CUSTOMER WHERE CustName LIKE 'A%';
Q50 Display employees whose name ends with 'k'.
SELECT * FROM EMPLOYEE WHERE EmpName LIKE '%k';
Q51 Display cars whose name contains 'SWIFT'.
SELECT * FROM INVENTORY WHERE CarName LIKE '%SWIFT%';
Q52 Display customers with 'yahoo' in their email.
SELECT * FROM CUSTOMER WHERE Email LIKE '%yahoo%';
Q53 Display employees whose salary is NULL.
SELECT * FROM EMPLOYEE WHERE Salary IS NULL;
Q54 Display sales where SalePrice is not NULL.
SELECT * FROM SALE WHERE SalePrice IS NOT NULL;
Q55 Display cars with price greater than 500000 and year 2017.
SELECT * FROM INVENTORY WHERE Price > 500000 AND Year = 2017;
SECTION 5: ORDER BY, GROUP BY, HAVING Q56-Q70
Q56 Display all cars in ascending order of price.
SELECT * FROM INVENTORY ORDER BY Price ASC;
Q57 Display all cars in descending order of price.
SELECT * FROM INVENTORY ORDER BY Price DESC;
Q58 Display employees in descending order of salary.
SELECT * FROM EMPLOYEE ORDER BY Salary DESC;
Q59 Display customers in ascending order of name.
SELECT * FROM CUSTOMER ORDER BY CustName ASC;
Q60 Count the total number of cars in INVENTORY.
SELECT COUNT(*) FROM INVENTORY;
Q61 Count the total number of customers.
SELECT COUNT(*) FROM CUSTOMER;
Q62 Count the total number of sales.
SELECT COUNT(*) FROM SALE;
Q63 Find the maximum price of cars.
SELECT MAX(Price) FROM INVENTORY;
Q64 Find the minimum salary of employees.
SELECT MIN(Salary) FROM EMPLOYEE;
Q65 Find the average price of cars.
SELECT AVG(Price) FROM INVENTORY;
Q66 Find the sum of all sale prices.
SELECT SUM(SalePrice) FROM SALE;
Q67 Group cars by model and count each model.
SELECT Model, COUNT(*) FROM INVENTORY GROUP BY Model;
Q68 Group employees by designation and count.
SELECT Designation, COUNT(*) FROM EMPLOYEE GROUP BY Designation;
Q69 Group sales by payment mode and count.
SELECT PaymentMode, COUNT(*) FROM SALE GROUP BY PaymentMode;
Q70 Display models with more than 1 car.
SELECT Model, COUNT(*) FROM INVENTORY GROUP BY Model HAVING COUNT(*) > 1;
SECTION 6: SINGLE ROW FUNCTIONS Q71-Q85
Q71 Display car names in uppercase.
SELECT UPPER(CarName) FROM INVENTORY;
Q72 Display customer names in lowercase.
SELECT LOWER(CustName) FROM CUSTOMER;
Q73 Display the length of each customer name.
SELECT CustName, LENGTH(CustName) FROM CUSTOMER;
Q74 Display the first 3 characters of each car name.
SELECT CarName, LEFT(CarName, 3) FROM INVENTORY;
Q75 Display the last 3 characters of each employee name.
SELECT EmpName, RIGHT(EmpName, 3) FROM EMPLOYEE;
Q76 Display car price rounded to 1 decimal place.
SELECT CarName, ROUND(Price, 1) FROM INVENTORY;
Q77 Display car price rounded to the nearest integer.
SELECT CarName, ROUND(Price, 0) FROM INVENTORY;
Q78 Calculate 10% of car price as discount.
SELECT CarName, Price, Price * 0.10 AS Discount FROM INVENTORY;
Q79 Find the power of 2 raised to 3.
SELECT POWER(2, 3);
Q80 Display the day name of employee's date of birth.
SELECT EmpName, DAYNAME(DOB) FROM EMPLOYEE;
Q81 Display the month name of employee's joining date.
SELECT EmpName, MONTHNAME(DOJ) FROM EMPLOYEE;
Q82 Display the year of sale.
SELECT Invoiceno, YEAR(SaleDate) FROM SALE;
Q83 Display the current date and time.
SELECT NOW();
Q84 Extract month from sale date.
SELECT Invoiceno, MONTH(SaleDate) FROM SALE;
Q85 Display all details where employee name contains 'a'.
SELECT * FROM EMPLOYEE WHERE EmpName LIKE '%a%';
SECTION 7: JOIN OPERATIONS Q86-Q95
Q86 Display sales with car details using JOIN.
SELECT S.*, I.CarName, I.Model, I.FuelType
FROM SALE S
JOIN INVENTORY I ON S.CarId = I.CarId;
Q87 Display sales with customer details using JOIN.
SELECT S.*, C.CustName, C.Phone, C.Email
FROM SALE S
JOIN CUSTOMER C ON S.CustId = C.CustId;
Q88 Display sales with employee details using NATURAL JOIN.
SELECT * FROM SALE NATURAL JOIN EMPLOYEE;
Q89 Display all sales with customer name and employee name.
SELECT S.Invoiceno, C.CustName, E.EmpName, S.SalePrice
FROM SALE S
JOIN CUSTOMER C ON S.CustId = C.CustId
JOIN EMPLOYEE E ON S.EmpID = E.EmpID;
Q90 Display car name and total sales amount for each car.
SELECT I.CarName, SUM(S.SalePrice) AS TotalSales
FROM INVENTORY I
JOIN SALE S ON I.CarId = S.CarId
GROUP BY I.CarName;
Q91 Display customer name and total purchase amount.
SELECT C.CustName, SUM(S.SalePrice) AS TotalPurchase
FROM CUSTOMER C
JOIN SALE S ON C.CustId = S.CustId
GROUP BY C.CustName;
Q92 Display employee name and total sales made by each.
SELECT E.EmpName, COUNT(S.Invoiceno) AS TotalSales
FROM EMPLOYEE E
JOIN SALE S ON E.EmpID = S.EmpID
GROUP BY E.EmpName;
Q93 Display sales with car details where price > 600000.
SELECT S.*, I.CarName, I.Price
FROM SALE S
JOIN INVENTORY I ON S.CarId = I.CarId
WHERE I.Price > 600000;
Q94 Display customers who purchased 'Baleno' cars.
SELECT DISTINCT C.CustName, C.Phone
FROM CUSTOMER C
JOIN SALE S ON C.CustId = S.CustId
JOIN INVENTORY I ON S.CarId = I.CarId
WHERE I.CarName = 'Baleno';
Q95 Display cars that were sold in 2019.
SELECT DISTINCT I.CarName, I.Price, I.Model
FROM INVENTORY I
JOIN SALE S ON I.CarId = S.CarId
WHERE YEAR(S.SaleDate) = 2019;
SECTION 8: ADVANCED QUERIES Q96-Q100
Q96 Display customers who have purchased more than 1 car.
SELECT C.CustName, COUNT(S.Invoiceno) AS CarCount
FROM CUSTOMER C
JOIN SALE S ON C.CustId = S.CustId
GROUP BY C.CustName
HAVING COUNT(S.Invoiceno) > 1;
Q97 Display the employee who made the maximum sale amount.
SELECT E.EmpName, SUM(S.SalePrice) AS TotalSales
FROM EMPLOYEE E
JOIN SALE S ON E.EmpID = S.EmpID
GROUP BY E.EmpName
ORDER BY TotalSales DESC
LIMIT 1;
Q98 Display the most expensive car that was sold.
SELECT I.CarName, I.Price
FROM INVENTORY I
JOIN SALE S ON I.CarId = S.CarId
ORDER BY I.Price DESC
LIMIT 1;
Q99 Display all cars with their sale count (including cars not sold).
SELECT I.CarName, COUNT(S.CarId) AS TimesSold
FROM INVENTORY I
LEFT JOIN SALE S ON I.CarId = S.CarId
GROUP BY I.CarName;
Q100 Display payment mode with maximum sales amount.
SELECT PaymentMode, SUM(SalePrice) AS TotalAmount
FROM SALE
GROUP BY PaymentMode
ORDER BY TotalAmount DESC
LIMIT 1;
SECTION 9: COMPLEX DDL OPERATIONS Q101-Q110
Q101 Create a table SALE_DETAILS with composite primary key.
CREATE TABLE SALE_DETAILS (
InvoiceNo VARCHAR(10),
CarId VARCHAR(10),
CustId VARCHAR(10),
SaleDate DATE,
PaymentMode VARCHAR(15),
EmpID VARCHAR(10),
SalePrice DECIMAL(10,2),
Commission DECIMAL(7,2),
Discount DECIMAL(7,2),
PRIMARY KEY (InvoiceNo, CarId),
FOREIGN KEY (CarId) REFERENCES INVENTORY(CarId),
FOREIGN KEY (CustId) REFERENCES CUSTOMER(CustId),
FOREIGN KEY (EmpID) REFERENCES EMPLOYEE(EmpID)
);
Q102 Create a table with CHECK constraint.
CREATE TABLE INVENTORY_NEW (
CarId VARCHAR(10) PRIMARY KEY,
CarName VARCHAR(20),
Price DECIMAL(10,2) CHECK (Price > 0),
Model VARCHAR(10),
Year INT CHECK (Year BETWEEN 2000 AND 2025),
FuelType VARCHAR(10)
);
Q103 Add a composite primary key to SALE table.
ALTER TABLE SALE ADD PRIMARY KEY (InvoiceNo, CarId);
Q104 Add a foreign key with ON DELETE CASCADE.
ALTER TABLE SALE ADD CONSTRAINT fk_car
FOREIGN KEY (CarId) REFERENCES INVENTORY(CarId) ON DELETE CASCADE;
Q105 Add a CHECK constraint to ensure SalePrice is not negative.
ALTER TABLE SALE ADD CONSTRAINT chk_price CHECK (SalePrice >= 0);
Q106 Add a UNIQUE constraint on (CustName, Phone).
ALTER TABLE CUSTOMER ADD CONSTRAINT unique_customer UNIQUE (CustName, Phone);
Q107 Create an index on CarName in INVENTORY table.
CREATE INDEX idx_carname ON INVENTORY(CarName);
Q108 Create a view 'Expensive_Cars'.
CREATE VIEW Expensive_Cars AS
SELECT * FROM INVENTORY WHERE Price > 600000;
Q109 Modify the view to include only VXI and ZXI models.
CREATE OR REPLACE VIEW Expensive_Cars AS
SELECT * FROM INVENTORY WHERE Price > 600000 AND Model IN ('VXI', 'ZXI');
Q110 Create a view 'Sales_Summary'.
CREATE VIEW Sales_Summary AS
SELECT C.CustId, C.CustName, COUNT(S.InvoiceNo) AS TotalPurchases,
SUM(S.SalePrice) AS TotalAmount
FROM CUSTOMER C LEFT JOIN SALE S ON C.CustId = S.CustId
GROUP BY C.CustId, C.CustName;
SECTION 10: COMPLEX INSERT OPERATIONS Q111-Q120
Q111 Insert multiple employees using a single INSERT.
INSERT INTO EMPLOYEE VALUES
('E013', 'Suresh Kumar', '1988-03-15', '2015-06-01', 'Manager', 55000),
('E014', 'Meena Sharma', '1990-07-20', '2016-08-15', 'Salesman', 32000),
('E015', 'Rajesh Patel', '1985-11-05', '2014-02-10', 'Salesman', 34500);
Q112 Insert a car and its sale using transactions.
START TRANSACTION;
INSERT INTO INVENTORY VALUES ('S007', 'CIAZ', 750000, 'ZXI', 2020, 'Petrol');
INSERT INTO SALE VALUES ('I00009', 'S007', 'C0001', '2020-02-15', 'Bank Finance', 'E004', 720000);
COMMIT;
Q113 Insert with calculated Commission.
INSERT INTO SALE (InvoiceNo, CarId, CustId, SaleDate, PaymentMode, EmpID, SalePrice, Commission)
VALUES ('I00010', 'B001', 'C0003', '2020-02-20', 'Credit Card', 'E002', 635074, 635074 * 0.12);
Q114 Insert with DEFAULT value for Price.
ALTER TABLE INVENTORY MODIFY Price DECIMAL(10,2) DEFAULT 0;
INSERT INTO INVENTORY (CarId, CarName, Model, Year, FuelType)
VALUES ('S008', 'NEXON', 'XZA', 2019, 'Diesel');
Q115 Insert with Commission using ROUND function.
INSERT INTO SALE VALUES ('I00011', 'S002', 'C0004', '2020-02-25', 'Online', 'E010', 687680, ROUND(687680 * 0.12, 2));
Q116 Copy records to backup table.
CREATE TABLE EMPLOYEE_BACKUP AS SELECT * FROM EMPLOYEE WHERE 1=0;
INSERT INTO EMPLOYEE_BACKUP SELECT * FROM EMPLOYEE;
Q117 Insert from SELECT with calculated values.
INSERT INTO SALE (InvoiceNo, CarId, CustId, SaleDate, PaymentMode, EmpID, SalePrice, Commission)
SELECT
CONCAT('I', LPAD(ROW_NUMBER() OVER (ORDER BY CarId) + 11, 5, '0')),
CarId, 'C0001', CURDATE(), 'Cash', 'E001',
Price * 1.05, Price * 0.05
FROM INVENTORY
WHERE Price > 600000;
Q118 Insert conditional data using SELECT.
INSERT INTO SALE (InvoiceNo, CarId, CustId, SaleDate, PaymentMode, EmpID, SalePrice)
SELECT CONCAT('I', FLOOR(RAND()*100000)), CarId, 'C0001', CURDATE(), 'Cash', 'E001', Price
FROM INVENTORY WHERE Year = 2019;
Q119 Insert multiple customers using recursive CTE.
INSERT INTO CUSTOMER (CustId, CustName, Phone, Email)
WITH RECURSIVE customer_cte AS (
SELECT 'C0010' AS id, 'Amit Kumar' AS name, '9876543201' AS phone, 'amit@gmail.com' AS email
UNION ALL
SELECT CONCAT('C', LPAD(CAST(SUBSTR(id,2) AS UNSIGNED) + 1, 4, '0')),
CONCAT('Customer', CAST(SUBSTR(id,2) AS UNSIGNED) + 1),
CONCAT('98', LPAD(FLOOR(RAND()*100000000), 8, '0')),
CONCAT('cust', CAST(SUBSTR(id,2) AS UNSIGNED) + 1, '@gmail.com')
FROM customer_cte WHERE CAST(SUBSTR(id,2) AS UNSIGNED) < 5
)
SELECT id, name, phone, email FROM customer_cte;
Q120 Insert with validation using IFNULL and COALESCE.
INSERT INTO CUSTOMER (CustId, CustName, CustAdd, Phone, Email)
VALUES ('C0020', 'Deepak Gupta', 'Delhi', '9876543212', COALESCE(NULL, 'deepak@gmail.com'));
SECTION 11: ADVANCED SELECT WITH COMPLEX WHERE Q121-Q130
Q121 Find cars with price between 400000 and 600000 OR (model = 'VXI' AND year >= 2018).
SELECT * FROM INVENTORY
WHERE (Price BETWEEN 400000 AND 600000)
OR (Model = 'VXI' AND Year >= 2018);
Q122 Find employees whose salary is NOT between 25000 and 40000.
SELECT * FROM EMPLOYEE
WHERE Salary NOT BETWEEN 25000 AND 40000;
Q123 Find customers whose name has exactly 5 characters.
SELECT * FROM CUSTOMER
WHERE LENGTH(CustName) = 5;
Q124 Find employees whose name starts with 'A' OR 'S'.
SELECT * FROM EMPLOYEE
WHERE (EmpName LIKE 'A%' OR EmpName LIKE 'S%') AND Salary > 30000;
Q125 Find sales where sale price > 600000 OR payment mode is 'Bank Finance'.
SELECT * FROM SALE
WHERE SalePrice > 600000 OR PaymentMode = 'Bank Finance';
Q126 Find cars NOT sold in 2019.
SELECT I.* FROM INVENTORY I
WHERE I.CarId NOT IN (
SELECT DISTINCT CarId FROM SALE WHERE YEAR(SaleDate) = 2019
);
Q127 Find customers who have NOT purchased any car.
SELECT * FROM CUSTOMER
WHERE CustId NOT IN (SELECT DISTINCT CustId FROM SALE);
Q128 Find employees who have NOT made any sale.
SELECT * FROM EMPLOYEE
WHERE EmpID NOT IN (SELECT DISTINCT EmpID FROM SALE);
Q129 Find cars sold at least twice.
SELECT CarId, COUNT(*) AS SaleCount
FROM SALE
GROUP BY CarId
HAVING COUNT(*) >= 2;
Q130 Find customers who bought 'Petrol' and 'Diesel' cars.
SELECT C.CustName
FROM CUSTOMER C
WHERE EXISTS (
SELECT 1 FROM SALE S
JOIN INVENTORY I ON S.CarId = I.CarId
WHERE S.CustId = C.CustId AND I.FuelType = 'Petrol'
) AND EXISTS (
SELECT 1 FROM SALE S
JOIN INVENTORY I ON S.CarId = I.CarId
WHERE S.CustId = C.CustId AND I.FuelType = 'Diesel'
);
SECTION 12: COMPLEX AGGREGATE FUNCTIONS Q131-Q140
Q131 Calculate average, max, min, count by model.
SELECT Model,
COUNT(*) AS Count,
AVG(Price) AS AvgPrice,
MAX(Price) AS MaxPrice,
MIN(Price) AS MinPrice,
SUM(Price) AS TotalPrice
FROM INVENTORY
GROUP BY Model;
Q132 Find total sales amount and average by payment mode.
SELECT PaymentMode,
SUM(SalePrice) AS TotalAmount,
AVG(SalePrice) AS AvgSale,
COUNT(*) AS Count
FROM SALE
GROUP BY PaymentMode
HAVING AVG(SalePrice) > 500000;
Q133 Calculate month-wise and year-wise sales totals.
SELECT YEAR(SaleDate) AS Year,
MONTH(SaleDate) AS Month,
COUNT(*) AS TotalSales,
SUM(SalePrice) AS TotalAmount
FROM SALE
GROUP BY YEAR(SaleDate), MONTH(SaleDate)
ORDER BY Year DESC, Month DESC;
Q134 Calculate employee performance.
SELECT E.EmpName,
COUNT(S.InvoiceNo) AS SalesCount,
SUM(S.SalePrice) AS TotalSales,
AVG(S.SalePrice) AS AvgSale,
MAX(S.SalePrice) AS MaxSale,
MIN(S.SalePrice) AS MinSale
FROM EMPLOYEE E
LEFT JOIN SALE S ON E.EmpID = S.EmpID
GROUP BY E.EmpName
HAVING COUNT(S.InvoiceNo) > 0
ORDER BY TotalSales DESC;
Q135 Find top 3 most expensive cars by model.
WITH RankedCars AS (
SELECT CarName, Model, Price,
RANK() OVER (PARTITION BY Model ORDER BY Price DESC) AS RankInModel
FROM INVENTORY
)
SELECT CarName, Model, Price, RankInModel
FROM RankedCars
WHERE RankInModel <= 3;
Q136 Calculate running total of sales by date.
SELECT SaleDate,
SUM(SalePrice) AS DailyTotal,
SUM(SUM(SalePrice)) OVER (ORDER BY SaleDate) AS RunningTotal
FROM SALE
GROUP BY SaleDate
ORDER BY SaleDate;
Q137 Group by fuel type and year.
SELECT FuelType, Year,
COUNT(*) AS CarCount,
AVG(Price) AS AvgPrice,
ROUND(AVG(Price) * 1.2, 2) AS FuturePrice
FROM INVENTORY
GROUP BY FuelType, Year
HAVING COUNT(*) > 0
ORDER BY FuelType, Year DESC;
Q138 Calculate standard deviation and variance.
SELECT Model,
COUNT(*) AS Count,
AVG(Price) AS AvgPrice,
STD(Price) AS StdDev,
VARIANCE(Price) AS Variance
FROM INVENTORY
GROUP BY Model;
Q139 Find months with maximum sales.
WITH MonthlySales AS (
SELECT YEAR(SaleDate) AS Year,
MONTH(SaleDate) AS Month,
SUM(SalePrice) AS TotalSales
FROM SALE
GROUP BY YEAR(SaleDate), MONTH(SaleDate)
)
SELECT Year, Month, TotalSales,
RANK() OVER (ORDER BY TotalSales DESC) AS SalesRank
FROM MonthlySales;
Q140 Calculate 3-month moving average.
WITH DailySales AS (
SELECT SaleDate, SUM(SalePrice) AS TotalSales
FROM SALE
GROUP BY SaleDate
)
SELECT SaleDate, TotalSales,
AVG(TotalSales) OVER (ORDER BY SaleDate ROWS BETWEEN 2 PRECEDING AND CURRENT ROW) AS MovingAvg3
FROM DailySales;
SECTION 13: ADVANCED STRING AND DATE FUNCTIONS Q141-Q150
Q141 Extract domain from email and count by domain.
SELECT SUBSTRING_INDEX(Email, '@', -1) AS Domain,
COUNT(*) AS CustomerCount
FROM CUSTOMER
WHERE Email IS NOT NULL
GROUP BY SUBSTRING_INDEX(Email, '@', -1)
ORDER BY CustomerCount DESC;
Q142 Display day of week and sales count.
SELECT DAYNAME(SaleDate) AS DayOfWeek,
COUNT(*) AS SalesCount,
SUM(SalePrice) AS TotalAmount
FROM SALE
GROUP BY DAYNAME(SaleDate)
ORDER BY FIELD(DAYNAME(SaleDate), 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday', 'Sunday');
Q143 Show employee age at joining.
SELECT EmpName, DOB, DOJ,
TIMESTAMPDIFF(YEAR, DOB, DOJ) AS AgeAtJoining,
TIMESTAMPDIFF(YEAR, DOB, CURDATE()) AS CurrentAge
FROM EMPLOYEE;
Q144 Extract first name and last name.
SELECT EmpName,
SUBSTRING_INDEX(EmpName, ' ', 1) AS FirstName,
CASE
WHEN LENGTH(EmpName) - LENGTH(REPLACE(EmpName, ' ', '')) >= 1
THEN SUBSTRING_INDEX(EmpName, ' ', -1)
ELSE ''
END AS LastName
FROM EMPLOYEE;
Q145 Format sale price in Indian currency.
SELECT InvoiceNo,
SalePrice,
FORMAT(SalePrice, 2) AS FormattedPrice,
CONCAT('₹', FORMAT(SalePrice, 0)) AS IndianCurrency
FROM SALE;
Q146 Find cars manufactured in same year as sale.
SELECT I.CarName, I.Year AS ManufacturingYear,
YEAR(S.SaleDate) AS SaleYear
FROM INVENTORY I
JOIN SALE S ON I.CarId = S.CarId
WHERE I.Year = YEAR(S.SaleDate);
Q147 Convert date to different formats.
SELECT SaleDate,
DATE_FORMAT(SaleDate, '%W, %M %d, %Y') AS LongDate,
DATE_FORMAT(SaleDate, '%d/%m/%Y') AS ShortDate,
DATE_FORMAT(SaleDate, '%b %d') AS Abbreviated,
DATE_FORMAT(SaleDate, '%Y-%m-%d') AS ISODate
FROM SALE;
Q148 Calculate days between sale date and current date.
SELECT InvoiceNo,
SaleDate,
DATEDIFF(CURDATE(), SaleDate) AS DaysSinceSale,
TIMESTAMPDIFF(DAY, SaleDate, CURDATE()) AS DaysDiff,
TIMESTAMPDIFF(MONTH, SaleDate, CURDATE()) AS MonthsSince
FROM SALE;
Q149 Mask phone number and email.
SELECT CustName,
Phone,
CONCAT(LEFT(Phone, 3), '******', RIGHT(Phone, 2)) AS MaskedPhone,
CONCAT(LEFT(Email, 2), '****', SUBSTRING_INDEX(Email, '@', -1)) AS MaskedEmail
FROM CUSTOMER;
Q150 Find quarter and fiscal year for each sale.
SELECT InvoiceNo,
SaleDate,
QUARTER(SaleDate) AS Quarter,
YEAR(SaleDate) AS Year,
CONCAT('Q', QUARTER(SaleDate), '-', YEAR(SaleDate)) AS QuarterYear,
CASE
WHEN MONTH(SaleDate) BETWEEN 4 AND 6 THEN 'Q1'
WHEN MONTH(SaleDate) BETWEEN 7 AND 9 THEN 'Q2'
WHEN MONTH(SaleDate) BETWEEN 10 AND 12 THEN 'Q3'
ELSE 'Q4'
END AS FinancialQuarter
FROM SALE;
SECTION 14: ADVANCED JOINS AND SUBQUERIES Q151-Q160
Q151 Find customers who bought from more than one fuel type.
SELECT C.CustName,
COUNT(DISTINCT I.FuelType) AS FuelTypesCount,
GROUP_CONCAT(DISTINCT I.FuelType) AS FuelTypes
FROM CUSTOMER C
JOIN SALE S ON C.CustId = S.CustId
JOIN INVENTORY I ON S.CarId = I.CarId
GROUP BY C.CustId, C.CustName
HAVING COUNT(DISTINCT I.FuelType) > 1;
Q152 Find the second highest price car.
SELECT * FROM INVENTORY
ORDER BY Price DESC
LIMIT 1 OFFSET 1;
Q153 Find employees who sold more than average.
WITH EmployeeSales AS (
SELECT EmpID, COUNT(*) AS TotalSales
FROM SALE
GROUP BY EmpID
)
SELECT E.EmpName, ES.TotalSales, AVG(ES.TotalSales) OVER () AS AvgSales
FROM EMPLOYEE E
JOIN EmployeeSales ES ON E.EmpID = ES.EmpID
WHERE ES.TotalSales > (SELECT AVG(TotalSales) FROM EmployeeSales);
Q154 Find the most frequent customer.
SELECT C.CustName, COUNT(S.InvoiceNo) AS PurchaseCount,
DENSE_RANK() OVER (ORDER BY COUNT(S.InvoiceNo) DESC) AS Rank
FROM CUSTOMER C
JOIN SALE S ON C.CustId = S.CustId
GROUP BY C.CustId, C.CustName
LIMIT 1;
Q155 Display sales with ranking by price.
SELECT InvoiceNo, CarId, SalePrice,
RANK() OVER (ORDER BY SalePrice DESC) AS PriceRank,
DENSE_RANK() OVER (ORDER BY SalePrice DESC) AS DenseRank,
ROW_NUMBER() OVER (ORDER BY SalePrice DESC) AS RowNum
FROM SALE;
Q156 Find cars never sold.
SELECT I.*
FROM INVENTORY I
LEFT JOIN SALE S ON I.CarId = S.CarId
WHERE S.CarId IS NULL;
Q157 Calculate percentage contribution of each payment mode.
SELECT PaymentMode,
COUNT(*) AS Count,
SUM(SalePrice) AS TotalAmount,
ROUND(SUM(SalePrice) * 100.0 / (SELECT SUM(SalePrice) FROM SALE), 2) AS PercentageContribution
FROM SALE
GROUP BY PaymentMode
ORDER BY TotalAmount DESC;
Q158 Find customers who spent more than average.
SELECT C.CustName, SUM(S.SalePrice) AS TotalSpent
FROM CUSTOMER C
JOIN SALE S ON C.CustId = S.CustId
GROUP BY C.CustId, C.CustName
HAVING SUM(S.SalePrice) > (SELECT AVG(TotalSpent)
FROM (SELECT SUM(SalePrice) AS TotalSpent
FROM SALE
GROUP BY CustId) AS CustomerTotals);
Q159 Display difference between car price and model average.
SELECT CarName, Model, Price,
AVG(Price) OVER (PARTITION BY Model) AS ModelAvgPrice,
Price - AVG(Price) OVER (PARTITION BY Model) AS PriceDifference,
ROUND((Price - AVG(Price) OVER (PARTITION BY Model)) * 100.0 / AVG(Price) OVER (PARTITION BY Model), 2) AS PercentDifference
FROM INVENTORY;
Q160 Find sales where price differs by more than 10%.
SELECT S.InvoiceNo, I.CarName, I.Price AS ListPrice, S.SalePrice,
ROUND((I.Price - S.SalePrice) * 100.0 / I.Price, 2) AS DiscountPercentage,
CASE
WHEN I.Price - S.SalePrice > I.Price * 0.10 THEN 'Heavy Discount'
WHEN S.SalePrice - I.Price > I.Price * 0.10 THEN 'Premium Price'
ELSE 'Normal'
END AS PriceCategory
FROM SALE S
JOIN INVENTORY I ON S.CarId = I.CarId;
SECTION 15: SET OPERATIONS AND CTEs Q161-Q170
Q161 Find customers who bought 'SWIFT' or 'BALENO' using UNION.
SELECT C.CustName, I.CarName
FROM CUSTOMER C
JOIN SALE S ON C.CustId = S.CustId
JOIN INVENTORY I ON S.CarId = I.CarId
WHERE I.CarName = 'SWIFT'
UNION
SELECT C.CustName, I.CarName
FROM CUSTOMER C
JOIN SALE S ON C.CustId = S.CustId
JOIN INVENTORY I ON S.CarId = I.CarId
WHERE I.CarName = 'BALENO';
Q162 Find customers who bought both 'SWIFT' and 'BALENO'.
SELECT CustName FROM CUSTOMER WHERE CustId IN (
SELECT CustId FROM SALE WHERE CarId IN
(SELECT CarId FROM INVENTORY WHERE CarName = 'SWIFT')
)
INTERSECT
SELECT CustName FROM CUSTOMER WHERE CustId IN (
SELECT CustId FROM SALE WHERE CarId IN
(SELECT CarId FROM INVENTORY WHERE CarName = 'BALENO')
);
Q163 Find cars sold by E001 but not by E002.
SELECT CarId FROM SALE WHERE EmpID = 'E001'
MINUS
SELECT CarId FROM SALE WHERE EmpID = 'E002';
Q164 Use CTE to find employees with more than 2 sales.
WITH SalesSummary AS (
SELECT EmpID,
COUNT(*) AS SaleCount,
AVG(SalePrice) AS AvgSale
FROM SALE
GROUP BY EmpID
HAVING COUNT(*) > 2
)
SELECT E.EmpName, SS.SaleCount, SS.AvgSale
FROM EMPLOYEE E
JOIN SalesSummary SS ON E.EmpID = SS.EmpID
ORDER BY SS.SaleCount DESC;
Q165 Create recursive CTE to generate date series.
WITH RECURSIVE DateSeries AS (
SELECT MIN(SaleDate) AS SaleDate FROM SALE
UNION ALL
SELECT DATE_ADD(SaleDate, INTERVAL 1 DAY)
FROM DateSeries
WHERE SaleDate < (SELECT MAX(SaleDate) FROM SALE)
)
SELECT DS.SaleDate,
COUNT(S.InvoiceNo) AS SalesCount,
COALESCE(SUM(S.SalePrice), 0) AS TotalAmount
FROM DateSeries DS
LEFT JOIN SALE S ON DS.SaleDate = S.SaleDate
GROUP BY DS.SaleDate
ORDER BY DS.SaleDate;
Q166 Find top 2 performing employees.
WITH EmployeePerformance AS (
SELECT EmpID,
SUM(SalePrice) AS TotalSales,
COUNT(*) AS SalesCount,
RANK() OVER (ORDER BY SUM(SalePrice) DESC) AS RankByAmount
FROM SALE
GROUP BY EmpID
)
SELECT E.EmpName, EP.TotalSales, EP.SalesCount
FROM EMPLOYEE E
JOIN EmployeePerformance EP ON E.EmpID = EP.EmpID
WHERE EP.RankByAmount <= 2
ORDER BY EP.TotalSales DESC;
Q167 Find customers who bought most expensive car.
WITH MostExpensiveCar AS (
SELECT CarId, Price
FROM INVENTORY
ORDER BY Price DESC
LIMIT 1
)
SELECT C.CustName, I.CarName, I.Price, S.SaleDate
FROM CUSTOMER C
JOIN SALE S ON C.CustId = S.CustId
JOIN INVENTORY I ON S.CarId = I.CarId
JOIN MostExpensiveCar MEC ON I.CarId = MEC.CarId;
Q168 Calculate cumulative sales for each employee.
SELECT EmpID, SaleDate, SalePrice,
SUM(SalePrice) OVER (PARTITION BY EmpID ORDER BY SaleDate) AS CumulativeSales,
AVG(SalePrice) OVER (PARTITION BY EmpID ORDER BY SaleDate ROWS BETWEEN 2 PRECEDING AND CURRENT ROW) AS MovingAvg3
FROM SALE
ORDER BY EmpID, SaleDate;
Q169 Find sales where same car sold within 30 days.
WITH CarSales AS (
SELECT CarId, SaleDate, InvoiceNo,
LAG(SaleDate, 1) OVER (PARTITION BY CarId ORDER BY SaleDate) AS PreviousSaleDate
FROM SALE
)
SELECT CarId, SaleDate, PreviousSaleDate,
DATEDIFF(SaleDate, PreviousSaleDate) AS DaysBetween
FROM CarSales
WHERE PreviousSaleDate IS NOT NULL
AND DATEDIFF(SaleDate, PreviousSaleDate) <= 30;
Q170 Calculate year-over-year growth in sales.
WITH YearlySales AS (
SELECT YEAR(SaleDate) AS Year,
SUM(SalePrice) AS TotalSales
FROM SALE
GROUP BY YEAR(SaleDate)
)
SELECT Year, TotalSales,
LAG(TotalSales, 1) OVER (ORDER BY Year) AS PreviousYearSales,
TotalSales - LAG(TotalSales, 1) OVER (ORDER BY Year) AS GrowthAmount,
ROUND((TotalSales - LAG(TotalSales, 1) OVER (ORDER BY Year)) * 100.0 / LAG(TotalSales, 1) OVER (ORDER BY Year), 2) AS GrowthPercentage
FROM YearlySales
ORDER BY Year;
SECTION 16: PIVOT AND WINDOW FUNCTIONS Q171-Q180
Q171 Create pivot table by model and fuel type.
SELECT FuelType,
SUM(CASE WHEN Model = 'VXI' THEN 1 ELSE 0 END) AS VXI_Count,
SUM(CASE WHEN Model = 'LXI' THEN 1 ELSE 0 END) AS LXI_Count,
SUM(CASE WHEN Model = 'ZXI' THEN 1 ELSE 0 END) AS ZXI_Count,
COUNT(*) AS TotalCount
FROM INVENTORY
GROUP BY FuelType;
Q172 Find percentile ranks of car prices.
SELECT CarName, Price,
ROUND(PERCENT_RANK() OVER (ORDER BY Price) * 100, 2) AS PercentileRank,
ROUND(CUME_DIST() OVER (ORDER BY Price) * 100, 2) AS CumulativePercent,
NTILE(4) OVER (ORDER BY Price) AS Quartile
FROM INVENTORY
ORDER BY Price;
Q173 Find median price of cars by model.
SELECT DISTINCT Model,
PERCENTILE_CONT(0.5) WITHIN GROUP (ORDER BY Price) OVER (PARTITION BY Model) AS MedianPrice
FROM INVENTORY;
Q174 Show first and last sale in each month.
SELECT InvoiceNo, SaleDate, SalePrice,
FIRST_VALUE(InvoiceNo) OVER (PARTITION BY YEAR(SaleDate), MONTH(SaleDate) ORDER BY SaleDate) AS FirstSaleOfMonth,
LAST_VALUE(InvoiceNo) OVER (PARTITION BY YEAR(SaleDate), MONTH(SaleDate) ORDER BY SaleDate
ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING) AS LastSaleOfMonth
FROM SALE
ORDER BY SaleDate;
Q175 Create pivot table by payment mode and year.
SELECT YEAR(SaleDate) AS SaleYear,
SUM(CASE WHEN PaymentMode = 'Cash' THEN SalePrice ELSE 0 END) AS CashSales,
SUM(CASE WHEN PaymentMode = 'Credit Card' THEN SalePrice ELSE 0 END) AS CreditCardSales,
SUM(CASE WHEN PaymentMode = 'Online' THEN SalePrice ELSE 0 END) AS OnlineSales,
SUM(CASE WHEN PaymentMode = 'Bank Finance' THEN SalePrice ELSE 0 END) AS BankFinanceSales,
SUM(CASE WHEN PaymentMode = 'Cheque' THEN SalePrice ELSE 0 END) AS ChequeSales,
SUM(SalePrice) AS TotalSales
FROM SALE
GROUP BY YEAR(SaleDate)
ORDER BY SaleYear;
Q176 Find gaps in sale dates.
WITH DateSeries AS (
SELECT MIN(SaleDate) AS SaleDate,
MAX(SaleDate) AS MaxSaleDate
FROM SALE
UNION ALL
SELECT DATE_ADD(SaleDate, INTERVAL 1 DAY), MaxSaleDate
FROM DateSeries
WHERE SaleDate < MaxSaleDate
)
SELECT DS.SaleDate
FROM DateSeries DS
LEFT JOIN SALE S ON DS.SaleDate = S.SaleDate
WHERE S.InvoiceNo IS NULL
ORDER BY DS.SaleDate;
Q177 Calculate days between sales for each employee.
WITH EmployeeSalesDates AS (
SELECT EmpID, SaleDate,
LAG(SaleDate, 1) OVER (PARTITION BY EmpID ORDER BY SaleDate) AS PreviousSale
FROM SALE
)
SELECT EmpID, SaleDate, PreviousSale,
DATEDIFF(SaleDate, PreviousSale) AS DaysBetweenSales,
AVG(DATEDIFF(SaleDate, PreviousSale)) OVER (PARTITION BY EmpID) AS AvgDaysBetween
FROM EmployeeSalesDates
WHERE PreviousSale IS NOT NULL;
Q178 Use LEAD and LAG for price changes.
SELECT CarName, Price,
LAG(Price, 1) OVER (ORDER BY Price) AS LowerPrice,
LEAD(Price, 1) OVER (ORDER BY Price) AS HigherPrice,
Price - LAG(Price, 1) OVER (ORDER BY Price) AS DifferenceFromLower,
LEAD(Price, 1) OVER (ORDER BY Price) - Price AS DifferenceToHigher
FROM INVENTORY
ORDER BY Price;
Q179 Create summary with ROLLUP.
SELECT
CASE WHEN GROUPING(Year) = 1 THEN 'Total' ELSE CAST(Year AS CHAR) END AS Year,
CASE WHEN GROUPING(FuelType) = 1 THEN 'All Fuels' ELSE FuelType END AS FuelType,
COUNT(*) AS CarCount,
ROUND(AVG(Price), 2) AS AvgPrice,
ROUND(SUM(Price), 2) AS TotalPrice
FROM INVENTORY
GROUP BY Year, FuelType WITH ROLLUP;
Q180 Identify customers with increasing purchases.
WITH CustomerPurchases AS (
SELECT CustId, SaleDate, SalePrice,
LAG(SalePrice, 1) OVER (PARTITION BY CustId ORDER BY SaleDate) AS PreviousPurchase
FROM SALE
)
SELECT CustId, SaleDate, SalePrice, PreviousPurchase,
CASE
WHEN PreviousPurchase IS NULL THEN 'First Purchase'
WHEN SalePrice > PreviousPurchase THEN 'Increased Spending'
WHEN SalePrice = PreviousPurchase THEN 'Same Spending'
ELSE 'Decreased Spending'
END AS SpendingPattern
FROM CustomerPurchases
ORDER BY CustId, SaleDate;
SECTION 17: COMPLEX UPDATE AND DELETE Q181-Q190
Q181 Update price and discount for 'Baleno'.
UPDATE INVENTORY
SET Price = Price * 1.10,
Discount = Price * 0.08
WHERE CarName = 'Baleno';
Q182 Update NULL prices to model average.
UPDATE INVENTORY I1
SET Price = (SELECT AVG(Price)
FROM INVENTORY I2
WHERE I2.Model = I1.Model AND I2.Price IS NOT NULL)
WHERE Price IS NULL;
Q183 Update commission to 15% for sales above 500000.
UPDATE SALE
SET Commission = SalePrice * 0.15
WHERE SalePrice > 500000;
Q184 Delete sales before 2019 for discontinued cars.
DELETE FROM SALE
WHERE YEAR(SaleDate) < 2019
AND CarId IN (SELECT CarId FROM INVENTORY WHERE Year < 2015);
Q185 Update employee status based on performance.
UPDATE EMPLOYEE E
SET Designation = CASE
WHEN (SELECT COUNT(*) FROM SALE S WHERE S.EmpID = E.EmpID) >= 3 THEN 'Star Salesman'
WHEN (SELECT COUNT(*) FROM SALE S WHERE S.EmpID = E.EmpID) >= 1 THEN 'Salesman'
ELSE 'Trainee'
END;
Q186 Delete duplicate customers based on phone.
DELETE FROM CUSTOMER
WHERE CustId NOT IN (
SELECT MIN(CustId)
FROM CUSTOMER
GROUP BY Phone
);
Q187 Update SalePrice to current inventory price.
UPDATE SALE S
JOIN INVENTORY I ON S.CarId = I.CarId
SET S.SalePrice = I.Price * (1 + RAND() * 0.1);
Q188 Delete sales where customer not confirmed.
DELETE FROM SALE
WHERE CustId IN (
SELECT CustId FROM CUSTOMER
WHERE Email LIKE '%temp%' OR Phone IS NULL
);
Q189 Update multiple columns using subquery.
UPDATE SALE S
SET SalePrice = (SELECT Price FROM INVENTORY I WHERE I.CarId = S.CarId),
Commission = (SELECT Price * 0.05 FROM INVENTORY I WHERE I.CarId = S.CarId)
WHERE PaymentMode = 'Cash';
Q190 Archive old sales to backup.
START TRANSACTION;
INSERT INTO SALE_BACKUP SELECT * FROM SALE WHERE YEAR(SaleDate) = 2018;
DELETE FROM SALE WHERE YEAR(SaleDate) = 2018;
COMMIT;
SECTION 18: PERFORMANCE AND OPTIMIZATION Q191-Q200
Q191 Create EXPLAIN plan for complex query.
EXPLAIN SELECT C.CustName, I.CarName, S.SalePrice
FROM SALE S
JOIN CUSTOMER C ON S.CustId = C.CustId
JOIN INVENTORY I ON S.CarId = I.CarId
WHERE S.SalePrice > (SELECT AVG(SalePrice) FROM SALE)
AND YEAR(S.SaleDate) = 2019
ORDER BY S.SalePrice DESC;
Q192 Use partitioning for large tables.
CREATE TABLE SALE_PARTITIONED (
InvoiceNo VARCHAR(10),
CarId VARCHAR(10),
CustId VARCHAR(10),
SaleDate DATE,
PaymentMode VARCHAR(15),
EmpID VARCHAR(10),
SalePrice DECIMAL(10,2)
)
PARTITION BY RANGE (YEAR(SaleDate)) (
PARTITION p2017 VALUES LESS THAN (2018),
PARTITION p2018 VALUES LESS THAN (2019),
PARTITION p2019 VALUES LESS THAN (2020),
PARTITION p2020 VALUES LESS THAN (2021)
);
Q193 Create materialized view.
CREATE TABLE SalesSummaryMonthly AS
SELECT YEAR(SaleDate) AS SaleYear,
MONTH(SaleDate) AS SaleMonth,
COUNT(*) AS TotalSales,
SUM(SalePrice) AS TotalAmount,
AVG(SalePrice) AS AvgPrice
FROM SALE
GROUP BY YEAR(SaleDate), MONTH(SaleDate);
Q194 Use query hints for index usage.
SELECT * FROM INVENTORY USE INDEX (idx_carname)
WHERE CarName LIKE 'BAL%';
Q195 Use EXISTS instead of IN for performance.
SELECT I.* FROM INVENTORY I
WHERE EXISTS (
SELECT 1 FROM SALE S
WHERE S.CarId = I.CarId AND S.SalePrice > 500000
);
Q196 Use batch processing for updates.
SET @batch_size = 100;
SET @start_id = 0;
WHILE @start_id < (SELECT MAX(InvoiceNo) FROM SALE) DO
UPDATE SALE
SET Commission = SalePrice * 0.12
WHERE InvoiceNo BETWEEN @start_id AND @start_id + @batch_size;
SET @start_id = @start_id + @batch_size;
END WHILE;
Q197 Create composite indexes.
CREATE INDEX idx_composite ON SALE(CustId, SaleDate, PaymentMode);
CREATE INDEX idx_sale_employee ON SALE(EmpID, SaleDate);
CREATE INDEX idx_inventory_model_year ON INVENTORY(Model, Year);
Q198 Use temporary table for calculations.
CREATE TEMPORARY TABLE TempSales AS
SELECT EmpID,
SUM(SalePrice) AS TotalSales,
COUNT(*) AS SaleCount
FROM SALE
GROUP BY EmpID;
SELECT E.EmpName, TS.TotalSales, TS.SaleCount
FROM EMPLOYEE E
JOIN TempSales TS ON E.EmpID = TS.EmpID
WHERE TS.TotalSales > 1000000;
DROP TEMPORARY TABLE TempSales;
Q199 Analyze tables for optimizer.
ANALYZE TABLE INVENTORY;
ANALYZE TABLE SALE;
ANALYZE TABLE CUSTOMER;
ANALYZE TABLE EMPLOYEE;
Q200 Stored procedure for commissions.
DELIMITER //
CREATE PROCEDURE UpdateCommissions()
BEGIN
DECLARE done INT DEFAULT FALSE;
DECLARE inv_no VARCHAR(10);
DECLARE sale_price DECIMAL(10,2);
DECLARE cur CURSOR FOR SELECT InvoiceNo, SalePrice FROM SALE;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;
OPEN cur;
read_loop: LOOP
FETCH cur INTO inv_no, sale_price;
IF done THEN
LEAVE read_loop;
END IF;
UPDATE SALE
SET Commission = ROUND(sale_price * 0.12, 2)
WHERE InvoiceNo = inv_no;
END LOOP;
CLOSE cur;
END //
DELIMITER ;
CALL UpdateCommissions();
SECTION 19: BONUS - TRIGGERS & MORE Q201-Q205
Q201 Create trigger to update inventory when car sold.
DELIMITER //
CREATE TRIGGER after_sale_insert
AFTER INSERT ON SALE
FOR EACH ROW
BEGIN
UPDATE INVENTORY
SET Status = 'Sold'
WHERE CarId = NEW.CarId;
END //
DELIMITER ;
Q202 Create trigger to validate sale price.
DELIMITER //
CREATE TRIGGER before_sale_insert
BEFORE INSERT ON SALE
FOR EACH ROW
BEGIN
DECLARE inventory_price DECIMAL(10,2);
SELECT Price INTO inventory_price
FROM INVENTORY
WHERE CarId = NEW.CarId;
IF NEW.SalePrice < inventory_price * 0.70 THEN
SIGNAL SQLSTATE '45000'
SET MESSAGE_TEXT = 'Sale price cannot be less than 70% of inventory price';
END IF;
END //
DELIMITER ;
Q203 Find customers who spent above city average.
SELECT C.CustName, C.City, SUM(S.SalePrice) AS TotalSpent,
AVG(SUM(S.SalePrice)) OVER (PARTITION BY C.City) AS CityAverage,
SUM(S.SalePrice) - AVG(SUM(S.SalePrice)) OVER (PARTITION BY C.City) AS Difference
FROM CUSTOMER C
JOIN SALE S ON C.CustId = S.CustId
GROUP BY C.CustId, C.CustName, C.City
HAVING SUM(S.SalePrice) > AVG(SUM(S.SalePrice)) OVER (PARTITION BY C.City)
ORDER BY C.City, TotalSpent DESC;
Q204 Calculate Customer Lifetime Value.
SELECT C.CustName,
COUNT(S.InvoiceNo) AS Purchases,
SUM(S.SalePrice) AS TotalSpent,
AVG(S.SalePrice) AS AvgPurchase,
MAX(S.SaleDate) AS LastPurchase,
DATEDIFF(CURDATE(), MAX(S.SaleDate)) AS DaysSinceLast,
CASE
WHEN DATEDIFF(CURDATE(), MAX(S.SaleDate)) < 30 THEN 'Active'
WHEN DATEDIFF(CURDATE(), MAX(S.SaleDate)) < 90 THEN 'Engaged'
ELSE 'At Risk'
END AS CustomerStatus
FROM CUSTOMER C
LEFT JOIN SALE S ON C.CustId = S.CustId
GROUP BY C.CustId, C.CustName
ORDER BY TotalSpent DESC;
Q205 Find most profitable product lines.
SELECT I.CarName,
COUNT(S.InvoiceNo) AS UnitsSold,
SUM(S.SalePrice) AS Revenue,
AVG(S.SalePrice) AS AvgSellingPrice,
I.Price AS ListPrice,
AVG(I.Price - S.SalePrice) AS AvgDiscount,
ROUND(((I.Price - S.SalePrice) * 100.0 / I.Price), 2) AS DiscountPercent
FROM INVENTORY I
JOIN SALE S ON I.CarId = S.CarId
GROUP BY I.CarId, I.CarName, I.Price
ORDER BY Revenue DESC;
SECTION 20: ADVANCED REPORTING & ANALYTICS Q206-Q220
Q206 Create pivot table by year and fuel type.
SELECT YEAR(SaleDate) AS SaleYear,
SUM(CASE WHEN FuelType = 'Petrol' THEN 1 ELSE 0 END) AS Petrol_Sales,
SUM(CASE WHEN FuelType = 'Diesel' THEN 1 ELSE 0 END) AS Diesel_Sales,
SUM(CASE WHEN FuelType = 'CNG' THEN 1 ELSE 0 END) AS CNG_Sales
FROM SALE S
JOIN INVENTORY I ON S.CarId = I.CarId
GROUP BY YEAR(SaleDate);
Q207 Calculate monthly commission per employee.
SELECT EmpID,
YEAR(SaleDate) AS SaleYear,
MONTH(SaleDate) AS SaleMonth,
SUM(Commission) AS TotalCommission
FROM SALE
WHERE Commission IS NOT NULL
GROUP BY EmpID, YEAR(SaleDate), MONTH(SaleDate)
ORDER BY EmpID, SaleYear DESC, SaleMonth DESC;
Q208 Find customers with consecutive monthly purchases.
WITH CustomerPurchases AS (
SELECT CustId,
YEAR(SaleDate) AS SaleYear,
MONTH(SaleDate) AS SaleMonth,
DATE_FORMAT(SaleDate, '%Y-%m') AS YearMonth
FROM SALE
GROUP BY CustId, YEAR(SaleDate), MONTH(SaleDate)
),
RankedPurchases AS (
SELECT CustId, YearMonth,
LAG(YearMonth, 1) OVER (PARTITION BY CustId ORDER BY YearMonth) AS PrevMonth
FROM CustomerPurchases
)
SELECT DISTINCT CustId
FROM RankedPurchases
WHERE PERIOD_DIFF(YearMonth, PrevMonth) = 1;
Q209 Calculate percentage of total sales by model.
SELECT I.Model,
SUM(S.SalePrice) AS TotalSales,
ROUND(SUM(S.SalePrice) * 100.0 / (SELECT SUM(SalePrice) FROM SALE), 2) AS PercentageContribution
FROM INVENTORY I
JOIN SALE S ON I.CarId = S.CarId
GROUP BY I.Model
ORDER BY TotalSales DESC;
Q210 Find employee with highest average sale price.
SELECT EmpID, AVG(SalePrice) AS AvgSalePrice
FROM SALE
GROUP BY EmpID
ORDER BY AvgSalePrice DESC
LIMIT 1;
Q211 Identify cars sold above list price.
SELECT S.InvoiceNo, I.CarName, I.Price AS ListPrice, S.SalePrice
FROM SALE S
JOIN INVENTORY I ON S.CarId = I.CarId
WHERE S.SalePrice > I.Price;
Q212 Calculate revenue per employee with commission.
SELECT E.EmpName,
COUNT(S.InvoiceNo) AS TotalSales,
SUM(S.SalePrice) AS TotalRevenue,
SUM(S.Commission) AS TotalCommission,
ROUND(SUM(S.Commission) * 100.0 / SUM(S.SalePrice), 2) AS CommissionRate
FROM EMPLOYEE E
JOIN SALE S ON E.EmpID = S.EmpID
WHERE S.Commission IS NOT NULL
GROUP BY E.EmpName
ORDER BY TotalRevenue DESC;
Q213 Find most popular payment mode by month.
WITH MonthlyPayment AS (
SELECT YEAR(SaleDate) AS SaleYear,
MONTH(SaleDate) AS SaleMonth,
PaymentMode,
COUNT(*) AS PaymentCount,
RANK() OVER (PARTITION BY YEAR(SaleDate), MONTH(SaleDate) ORDER BY COUNT(*) DESC) AS RankNum
FROM SALE
GROUP BY YEAR(SaleDate), MONTH(SaleDate), PaymentMode
)
SELECT SaleYear, SaleMonth, PaymentMode, PaymentCount
FROM MonthlyPayment
WHERE RankNum = 1
ORDER BY SaleYear, SaleMonth;
Q214 Calculate running total per employee.
SELECT EmpID,
SaleDate,
SalePrice,
SUM(SalePrice) OVER (PARTITION BY EmpID ORDER BY SaleDate) AS RunningTotal
FROM SALE
ORDER BY EmpID, SaleDate;
Q215 Find customers with increasing purchases.
WITH CustomerPurchases AS (
SELECT CustId, SaleDate, SalePrice,
LAG(SalePrice, 1) OVER (PARTITION BY CustId ORDER BY SaleDate) AS PrevPurchase
FROM SALE
)
SELECT CustId, SaleDate, SalePrice, PrevPurchase
FROM CustomerPurchases
WHERE SalePrice > PrevPurchase;
Q216 Calculate average days between sales per customer.
WITH CustomerSalesDates AS (
SELECT CustId, SaleDate,
LEAD(SaleDate, 1) OVER (PARTITION BY CustId ORDER BY SaleDate) AS NextSaleDate
FROM SALE
)
SELECT CustId,
AVG(DATEDIFF(NextSaleDate, SaleDate)) AS AvgDaysBetween
FROM CustomerSalesDates
WHERE NextSaleDate IS NOT NULL
GROUP BY CustId;
Q217 Identify best-selling model per year.
WITH YearlySales AS (
SELECT YEAR(SaleDate) AS SaleYear,
I.Model,
COUNT(*) AS SalesCount,
RANK() OVER (PARTITION BY YEAR(SaleDate) ORDER BY COUNT(*) DESC) AS RankNum
FROM SALE S
JOIN INVENTORY I ON S.CarId = I.CarId
GROUP BY YEAR(SaleDate), I.Model
)
SELECT SaleYear, Model, SalesCount
FROM YearlySales
WHERE RankNum = 1;
Q218 Calculate profit margin per sale.
SELECT InvoiceNo,
I.CarId,
I.Price AS ListPrice,
S.SalePrice,
(S.SalePrice - I.Price * 0.70) AS Profit,
ROUND((S.SalePrice - I.Price * 0.70) * 100.0 / S.SalePrice, 2) AS ProfitMargin
FROM SALE S
JOIN INVENTORY I ON S.CarId = I.CarId;
Q219 Find employees with improved performance.
WITH EmployeeQuarterlySales AS (
SELECT EmpID,
QUARTER(SaleDate) AS SaleQuarter,
YEAR(SaleDate) AS SaleYear,
SUM(SalePrice) AS TotalSales
FROM SALE
GROUP BY EmpID, YEAR(SaleDate), QUARTER(SaleDate)
),
EmployeeSalesTrend AS (
SELECT EmpID, SaleYear, SaleQuarter, TotalSales,
LAG(TotalSales, 1) OVER (PARTITION BY EmpID ORDER BY SaleYear, SaleQuarter) AS PrevQuarterSales
FROM EmployeeQuarterlySales
)
SELECT EmpID, SaleYear, SaleQuarter, TotalSales, PrevQuarterSales,
CASE
WHEN PrevQuarterSales IS NULL THEN 'First Quarter'
WHEN TotalSales > PrevQuarterSales THEN 'Improved'
WHEN TotalSales = PrevQuarterSales THEN 'Same'
ELSE 'Declined'
END AS Performance
FROM EmployeeSalesTrend;
Q220 Calculate total value of inventory.
SELECT SUM(Price) AS TotalInventoryValue,
AVG(Price) AS AvgPrice,
COUNT(*) AS TotalCars
FROM INVENTORY;
SECTION 21: COMPLEX DATA VALIDATION Q221-Q235
Q221 Find orphan records in SALE table.
SELECT S.*
FROM SALE S
LEFT JOIN INVENTORY I ON S.CarId = I.CarId
WHERE I.CarId IS NULL;
Q222 Find customers with duplicate phone numbers.
SELECT Phone, COUNT(*) AS DuplicateCount, GROUP_CONCAT(CustName) AS Customers
FROM CUSTOMER
WHERE Phone IS NOT NULL
GROUP BY Phone
HAVING COUNT(*) > 1;
Q223 Find sales with invalid employee IDs.
SELECT S.*
FROM SALE S
LEFT JOIN EMPLOYEE E ON S.EmpID = E.EmpID
WHERE E.EmpID IS NULL;
Q224 Find customers with invalid email addresses.
SELECT * FROM CUSTOMER
WHERE Email IS NOT NULL AND Email NOT LIKE '%@%';
Q225 Find duplicate car entries.
SELECT CarId, CarName, COUNT(*) AS DuplicateCount
FROM INVENTORY
GROUP BY CarId, CarName
HAVING COUNT(*) > 1;
Q226 Identify invalid payment modes.
SELECT DISTINCT PaymentMode
FROM SALE
WHERE PaymentMode NOT IN ('Cash', 'Credit Card', 'Online', 'Bank Finance', 'Cheque');
Q227 Find sales with negative sale price.
SELECT * FROM SALE WHERE SalePrice < 0;
Q228 Find employees with duplicate email addresses.
SELECT Email, COUNT(*) AS DuplicateCount
FROM EMPLOYEE
WHERE Email IS NOT NULL
GROUP BY Email
HAVING COUNT(*) > 1;
Q229 Find sales with future dates.
SELECT * FROM SALE WHERE SaleDate > CURDATE();
Q230 Find customers with missing contact information.
SELECT * FROM CUSTOMER
WHERE Phone IS NULL AND Email IS NULL;
Q231 Find cars with invalid manufacturing year.
SELECT * FROM INVENTORY WHERE Year < 2000 OR Year > YEAR(CURDATE());
Q232 Find sales where commission is negative.
SELECT * FROM SALE WHERE Commission < 0;
Q233 Find employees with salaries below minimum wage.
SELECT * FROM EMPLOYEE WHERE Salary < 15000;
Q234 Find customers with invalid phone numbers.
SELECT * FROM CUSTOMER
WHERE Phone IS NOT NULL AND LENGTH(Phone) < 10;
Q235 Find sales where sale date is before car manufacture date.
SELECT S.*, I.Year
FROM SALE S
JOIN INVENTORY I ON S.CarId = I.CarId
WHERE YEAR(S.SaleDate) < I.Year;
SECTION 22: COMPLEX REPORTS Q236-Q250
Q236 Create executive summary dashboard.
SELECT
(SELECT COUNT(*) FROM CUSTOMER) AS TotalCustomers,
(SELECT COUNT(*) FROM INVENTORY) AS TotalInventory,
(SELECT COUNT(*) FROM SALE) AS TotalSales,
(SELECT SUM(SalePrice) FROM SALE) AS TotalRevenue,
(SELECT AVG(SalePrice) FROM SALE) AS AvgSalePrice,
(SELECT MAX(SalePrice) FROM SALE) AS MaxSale;
Q237 Generate monthly sales report with growth.
WITH MonthlySales AS (
SELECT DATE_FORMAT(SaleDate, '%Y-%m') AS Month,
SUM(SalePrice) AS TotalSales,
COUNT(*) AS SaleCount
FROM SALE
GROUP BY DATE_FORMAT(SaleDate, '%Y-%m')
)
SELECT Month, TotalSales, SaleCount,
LAG(TotalSales, 1) OVER (ORDER BY Month) AS PrevMonthSales,
ROUND((TotalSales - LAG(TotalSales, 1) OVER (ORDER BY Month)) * 100.0 / LAG(TotalSales, 1) OVER (ORDER BY Month), 2) AS GrowthPercent
FROM MonthlySales
ORDER BY Month;
Q238 Generate employee performance report.
SELECT E.EmpName,
E.Designation,
COUNT(S.InvoiceNo) AS SalesCount,
SUM(S.SalePrice) AS TotalSales,
AVG(S.SalePrice) AS AvgSale,
SUM(S.Commission) AS TotalCommission,
RANK() OVER (ORDER BY SUM(S.SalePrice) DESC) AS PerformanceRank
FROM EMPLOYEE E
LEFT JOIN SALE S ON E.EmpID = S.EmpID
GROUP BY E.EmpName, E.Designation
ORDER BY TotalSales DESC;
Q239 Generate customer purchase report.
SELECT C.CustName,
COUNT(S.InvoiceNo) AS Purchases,
SUM(S.SalePrice) AS TotalSpent,
AVG(S.SalePrice) AS AvgPurchase,
MIN(S.SaleDate) AS FirstPurchase,
MAX(S.SaleDate) AS LastPurchase,
DATEDIFF(MAX(S.SaleDate), MIN(S.SaleDate)) AS CustomerLifetime
FROM CUSTOMER C
JOIN SALE S ON C.CustId = S.CustId
GROUP BY C.CustName
ORDER BY TotalSpent DESC;
Q240 Generate inventory valuation report.
SELECT Model,
COUNT(*) AS Quantity,
AVG(Price) AS AvgPrice,
MIN(Price) AS MinPrice,
MAX(Price) AS MaxPrice,
SUM(Price) AS TotalValue,
ROUND(SUM(Price) * 100.0 / (SELECT SUM(Price) FROM INVENTORY), 2) AS PercentageValue
FROM INVENTORY
GROUP BY Model
ORDER BY TotalValue DESC;
Q241 Generate sales by payment mode report.
SELECT PaymentMode,
COUNT(*) AS TransactionCount,
SUM(SalePrice) AS TotalAmount,
AVG(SalePrice) AS AvgAmount,
ROUND(SUM(SalePrice) * 100.0 / (SELECT SUM(SalePrice) FROM SALE), 2) AS PercentageShare
FROM SALE
GROUP BY PaymentMode
ORDER BY TotalAmount DESC;
Q242 Generate product performance report.
SELECT I.CarName,
I.Model,
COUNT(S.InvoiceNo) AS UnitsSold,
SUM(S.SalePrice) AS Revenue,
I.Price AS ListPrice,
ROUND(AVG(S.SalePrice - I.Price), 2) AS AvgDiscount,
ROUND(AVG(S.SalePrice) * 100.0 / I.Price, 2) AS PriceAchievement
FROM INVENTORY I
LEFT JOIN SALE S ON I.CarId = S.CarId
GROUP BY I.CarId, I.CarName, I.Model, I.Price
ORDER BY Revenue DESC;
Q243 Generate monthly employee performance.
SELECT E.EmpName,
YEAR(S.SaleDate) AS Year,
MONTH(S.SaleDate) AS Month,
COUNT(S.InvoiceNo) AS SalesCount,
SUM(S.SalePrice) AS TotalSales,
AVG(S.SalePrice) AS AvgSale
FROM EMPLOYEE E
JOIN SALE S ON E.EmpID = S.EmpID
GROUP BY E.EmpName, YEAR(S.SaleDate), MONTH(S.SaleDate)
ORDER BY Year DESC, Month DESC, TotalSales DESC;
Q244 Generate customer segmentation report.
SELECT
CASE
WHEN TotalSpent >= 1000000 THEN 'Platinum'
WHEN TotalSpent >= 500000 THEN 'Gold'
WHEN TotalSpent >= 200000 THEN 'Silver'
ELSE 'Bronze'
END AS CustomerSegment,
COUNT(*) AS CustomerCount,
SUM(TotalSpent) AS TotalRevenue,
AVG(TotalSpent) AS AvgSpending
FROM (
SELECT CustId, SUM(SalePrice) AS TotalSpent
FROM SALE
GROUP BY CustId
) AS CustomerSpending
GROUP BY CustomerSegment
ORDER BY TotalRevenue DESC;
Q245 Generate year-over-year comparison report.
SELECT YEAR(SaleDate) AS Year,
SUM(SalePrice) AS TotalSales,
COUNT(*) AS SaleCount,
AVG(SalePrice) AS AvgSale,
LAG(SUM(SalePrice), 1) OVER (ORDER BY YEAR(SaleDate)) AS PreviousYearSales,
ROUND((SUM(SalePrice) - LAG(SUM(SalePrice), 1) OVER (ORDER BY YEAR(SaleDate))) * 100.0 / LAG(SUM(SalePrice), 1) OVER (ORDER BY YEAR(SaleDate)), 2) AS GrowthRate
FROM SALE
GROUP BY YEAR(SaleDate)
ORDER BY Year;
Q246 Generate daily sales trend report.
SELECT SaleDate,
COUNT(*) AS SalesCount,
SUM(SalePrice) AS DailyRevenue,
AVG(SalePrice) AS AvgSalePrice,
SUM(SUM(SalePrice)) OVER (ORDER BY SaleDate) AS CumulativeRevenue
FROM SALE
GROUP BY SaleDate
ORDER BY SaleDate;
Q247 Generate commission report.
SELECT E.EmpName,
YEAR(S.SaleDate) AS Year,
MONTH(S.SaleDate) AS Month,
COUNT(S.InvoiceNo) AS SalesCount,
SUM(S.Commission) AS TotalCommission,
AVG(S.Commission) AS AvgCommission
FROM EMPLOYEE E
JOIN SALE S ON E.EmpID = S.EmpID
WHERE S.Commission IS NOT NULL
GROUP BY E.EmpName, YEAR(S.SaleDate), MONTH(S.SaleDate)
ORDER BY Year DESC, Month DESC, TotalCommission DESC;
Q248 Generate fuel type performance report.
SELECT I.FuelType,
COUNT(S.InvoiceNo) AS UnitsSold,
SUM(S.SalePrice) AS Revenue,
AVG(S.SalePrice) AS AvgPrice,
COUNT(DISTINCT S.CustId) AS UniqueCustomers,
ROUND(SUM(S.SalePrice) * 100.0 / (SELECT SUM(SalePrice) FROM SALE), 2) AS RevenueShare
FROM INVENTORY I
JOIN SALE S ON I.CarId = S.CarId
GROUP BY I.FuelType
ORDER BY Revenue DESC;
Q249 Generate employee retention report.
SELECT YEAR(DOJ) AS JoiningYear,
COUNT(*) AS EmployeesJoined,
SUM(CASE WHEN Designation LIKE '%Salesman%' THEN 1 ELSE 0 END) AS SalesCount,
AVG(Salary) AS AvgSalary,
MAX(Salary) AS MaxSalary,
MIN(Salary) AS MinSalary
FROM EMPLOYEE
GROUP BY YEAR(DOJ)
ORDER BY JoiningYear;
Q250 Generate quarterly business report.
SELECT YEAR(SaleDate) AS Year,
QUARTER(SaleDate) AS Quarter,
COUNT(*) AS SalesCount,
SUM(SalePrice) AS TotalRevenue,
AVG(SalePrice) AS AvgSale,
COUNT(DISTINCT CustId) AS UniqueCustomers,
COUNT(DISTINCT EmpID) AS ActiveEmployees
FROM SALE
GROUP BY YEAR(SaleDate), QUARTER(SaleDate)
ORDER BY Year DESC, Quarter DESC;
SECTION 23: ANALYTICAL FUNCTIONS Q251-Q265
Q251 Find top 3 customers by purchase amount.
SELECT CustId,
SUM(SalePrice) AS TotalPurchases,
DENSE_RANK() OVER (ORDER BY SUM(SalePrice) DESC) AS RankNum
FROM SALE
GROUP BY CustId
HAVING RankNum <= 3;
Q252 Calculate percentage contribution per model.
SELECT Model,
SUM(Price) AS TotalValue,
ROUND(SUM(Price) * 100.0 / SUM(SUM(Price)) OVER (), 2) AS PercentageShare
FROM INVENTORY
GROUP BY Model
ORDER BY TotalValue DESC;
Q253 Find customers with more than average purchases.
WITH CustomerStats AS (
SELECT CustId,
COUNT(*) AS PurchaseCount,
AVG(COUNT(*)) OVER () AS AvgPurchases
FROM SALE
GROUP BY CustId
)
SELECT CustId, PurchaseCount, AvgPurchases
FROM CustomerStats
WHERE PurchaseCount > AvgPurchases;
Q254 Calculate year-to-date sales.
SELECT EmpID,
SaleDate,
SalePrice,
SUM(SalePrice) OVER (PARTITION BY EmpID ORDER BY SaleDate) AS YTD_Sales
FROM SALE
WHERE YEAR(SaleDate) = YEAR(CURDATE())
ORDER BY EmpID, SaleDate;
Q255 Find employees with above-average sales.
WITH EmpSales AS (
SELECT EmpID,
SUM(SalePrice) AS TotalSales,
AVG(SUM(SalePrice)) OVER () AS AvgSales
FROM SALE
GROUP BY EmpID
)
SELECT EmpID, TotalSales, AvgSales
FROM EmpSales
WHERE TotalSales > AvgSales;
Q256 Calculate month-over-month growth.
WITH MonthlyRevenue AS (
SELECT DATE_FORMAT(SaleDate, '%Y-%m') AS Month,
SUM(SalePrice) AS Revenue
FROM SALE
GROUP BY DATE_FORMAT(SaleDate, '%Y-%m')
)
SELECT Month, Revenue,
LAG(Revenue, 1) OVER (ORDER BY Month) AS PrevMonth,
ROUND((Revenue - LAG(Revenue, 1) OVER (ORDER BY Month)) * 100.0 / LAG(Revenue, 1) OVER (ORDER BY Month), 2) AS MoMGrowth
FROM MonthlyRevenue
ORDER BY Month;
Q257 Find customer purchase frequency.
SELECT CustId,
COUNT(*) AS Purchases,
MIN(SaleDate) AS FirstPurchase,
MAX(SaleDate) AS LastPurchase,
DATEDIFF(MAX(SaleDate), MIN(SaleDate)) AS Duration,
ROUND(COUNT(*) / (DATEDIFF(MAX(SaleDate), MIN(SaleDate)) / 30), 2) AS PurchasesPerMonth
FROM SALE
GROUP BY CustId
HAVING COUNT(*) > 1
ORDER BY PurchasesPerMonth DESC;
Q258 Find model performance trend.
SELECT YEAR(S.SaleDate) AS Year,
I.Model,
COUNT(*) AS SalesCount,
SUM(S.SalePrice) AS Revenue,
RANK() OVER (PARTITION BY YEAR(S.SaleDate) ORDER BY SUM(S.SalePrice) DESC) AS ModelRank
FROM SALE S
JOIN INVENTORY I ON S.CarId = I.CarId
GROUP BY YEAR(S.SaleDate), I.Model
ORDER BY Year DESC, ModelRank;
Q259 Calculate employee sales efficiency.
SELECT E.EmpName,
COUNT(S.InvoiceNo) AS SalesCount,
SUM(S.SalePrice) AS Revenue,
DATEDIFF(CURDATE(), E.DOJ) AS DaysEmployed,
ROUND(SUM(S.SalePrice) / DATEDIFF(CURDATE(), E.DOJ), 2) AS RevenuePerDay,
ROUND(COUNT(S.InvoiceNo) / DATEDIFF(CURDATE(), E.DOJ) * 30, 2) AS SalesPerMonth
FROM EMPLOYEE E
JOIN SALE S ON E.EmpID = S.EmpID
GROUP BY E.EmpName, E.DOJ
ORDER BY RevenuePerDay DESC;
Q260 Find seasonal sales patterns.
SELECT MONTHNAME(SaleDate) AS Month,
YEAR(SaleDate) AS Year,
SUM(SalePrice) AS Revenue,
AVG(SUM(SalePrice)) OVER (PARTITION BY MONTH(SaleDate)) AS AvgForMonth,
RANK() OVER (PARTITION BY YEAR(SaleDate) ORDER BY SUM(SalePrice) DESC) AS MonthRank
FROM SALE
GROUP BY YEAR(SaleDate), MONTH(SaleDate)
ORDER BY Year, MONTH(SaleDate);
Q261 Find cross-selling opportunities.
SELECT DISTINCT S1.CustId, I1.CarName AS Car1, I2.CarName AS Car2
FROM SALE S1
JOIN INVENTORY I1 ON S1.CarId = I1.CarId
JOIN SALE S2 ON S1.CustId = S2.CustId AND S1.CarId != S2.CarId
JOIN INVENTORY I2 ON S2.CarId = I2.CarId
WHERE I1.CarName < I2.CarName
ORDER BY S1.CustId;
Q262 Calculate customer churn risk.
SELECT CustId,
MAX(SaleDate) AS LastPurchase,
DATEDIFF(CURDATE(), MAX(SaleDate)) AS DaysSinceLast,
CASE
WHEN DATEDIFF(CURDATE(), MAX(SaleDate)) > 180 THEN 'High Risk'
WHEN DATEDIFF(CURDATE(), MAX(SaleDate)) > 90 THEN 'Medium Risk'
ELSE 'Low Risk'
END AS ChurnRisk
FROM SALE
GROUP BY CustId
ORDER BY DaysSinceLast DESC;
Q263 Find price elasticity of demand.
SELECT Model,
AVG(Price) AS AvgPrice,
COUNT(*) AS Quantity,
ROUND(COUNT(*) / AVG(Price), 4) AS DemandElasticity
FROM INVENTORY
GROUP BY Model
ORDER BY DemandElasticity DESC;
Q264 Calculate sales velocity.
SELECT I.CarName,
COUNT(S.InvoiceNo) AS UnitsSold,
DATEDIFF(MAX(S.SaleDate), MIN(S.SaleDate)) AS SalesPeriod,
ROUND(COUNT(S.InvoiceNo) / NULLIF(DATEDIFF(MAX(S.SaleDate), MIN(S.SaleDate)), 0) * 30, 2) AS SalesPerMonth
FROM INVENTORY I
JOIN SALE S ON I.CarId = S.CarId
GROUP BY I.CarName
ORDER BY SalesPerMonth DESC;
Q265 Find top sales days.
SELECT SaleDate,
COUNT(*) AS SalesCount,
SUM(SalePrice) AS Revenue,
DAYNAME(SaleDate) AS DayOfWeek,
RANK() OVER (ORDER BY SUM(SalePrice) DESC) AS RevenueRank
FROM SALE
GROUP BY SaleDate
ORDER BY RevenueRank
LIMIT 10;
SECTION 24: ADVANCED JOINS Q266-Q280
Q266 Self-join to find customers with multiple purchases.
SELECT DISTINCT S1.CustId, S1.SaleDate AS FirstPurchase, S2.SaleDate AS SecondPurchase
FROM SALE S1
JOIN SALE S2 ON S1.CustId = S2.CustId AND S1.SaleDate < S2.SaleDate
WHERE NOT EXISTS (
SELECT 1 FROM SALE S3
WHERE S3.CustId = S1.CustId AND S3.SaleDate > S1.SaleDate AND S3.SaleDate < S2.SaleDate
);
Q267 Full outer join simulation for inventory and sales.
SELECT I.CarId, I.CarName, I.Price, COUNT(S.InvoiceNo) AS SalesCount
FROM INVENTORY I
LEFT JOIN SALE S ON I.CarId = S.CarId
GROUP BY I.CarId, I.CarName, I.Price
UNION ALL
SELECT S.CarId, NULL, NULL, COUNT(*)
FROM SALE S
LEFT JOIN INVENTORY I ON S.CarId = I.CarId
WHERE I.CarId IS NULL
GROUP BY S.CarId;
Q268 Join across all four tables.
SELECT S.InvoiceNo, S.SaleDate, C.CustName, E.EmpName, I.CarName, I.Model, S.SalePrice
FROM SALE S
JOIN CUSTOMER C ON S.CustId = C.CustId
JOIN EMPLOYEE E ON S.EmpID = E.EmpID
JOIN INVENTORY I ON S.CarId = I.CarId
ORDER BY S.SaleDate DESC;
Q269 Find customers who bought same car model.
SELECT C.CustName, I.Model, COUNT(*) AS Purchases
FROM CUSTOMER C
JOIN SALE S ON C.CustId = S.CustId
JOIN INVENTORY I ON S.CarId = I.CarId
GROUP BY C.CustName, I.Model
HAVING COUNT(*) > 1;
Q270 Self-join to find employee-employee sales comparison.
SELECT E1.EmpName AS Employee1, E2.EmpName AS Employee2,
SUM(S1.SalePrice) AS Sales1, SUM(S2.SalePrice) AS Sales2
FROM EMPLOYEE E1
JOIN SALE S1 ON E1.EmpID = S1.EmpID
JOIN EMPLOYEE E2 ON E1.EmpID < E2.EmpID
JOIN SALE S2 ON E2.EmpID = S2.EmpID
WHERE YEAR(S1.SaleDate) = YEAR(S2.SaleDate)
GROUP BY E1.EmpName, E2.EmpName
ORDER BY Sales1 DESC;
Q271 Multi-table join with aggregations.
SELECT C.CustName,
COUNT(S.InvoiceNo) AS TotalPurchases,
SUM(S.SalePrice) AS TotalSpent,
AVG(S.SalePrice) AS AvgPurchase,
GROUP_CONCAT(DISTINCT I.CarName) AS CarsPurchased
FROM CUSTOMER C
LEFT JOIN SALE S ON C.CustId = S.CustId
LEFT JOIN INVENTORY I ON S.CarId = I.CarId
GROUP BY C.CustName
ORDER BY TotalSpent DESC;
Q272 Find employees with no sales.
SELECT E.EmpName, E.Designation
FROM EMPLOYEE E
LEFT JOIN SALE S ON E.EmpID = S.EmpID
WHERE S.EmpID IS NULL;
Q273 Join to find most popular car per customer.
WITH CustomerCars AS (
SELECT C.CustName, I.CarName, COUNT(*) AS PurchaseCount,
RANK() OVER (PARTITION BY C.CustName ORDER BY COUNT(*) DESC) AS RankNum
FROM CUSTOMER C
JOIN SALE S ON C.CustId = S.CustId
JOIN INVENTORY I ON S.CarId = I.CarId
GROUP BY C.CustName, I.CarName
)
SELECT CustName, CarName, PurchaseCount
FROM CustomerCars
WHERE RankNum = 1;
Q274 Three-table join with conditions.
SELECT S.InvoiceNo, C.CustName, E.EmpName, I.CarName, S.SalePrice
FROM SALE S
INNER JOIN CUSTOMER C ON S.CustId = C.CustId
INNER JOIN EMPLOYEE E ON S.EmpID = E.EmpID
INNER JOIN INVENTORY I ON S.CarId = I.CarId
WHERE S.SalePrice > (SELECT AVG(SalePrice) FROM SALE)
AND YEAR(S.SaleDate) = 2019
ORDER BY S.SalePrice DESC;
Q275 Join with subquery in FROM clause.
SELECT C.CustName, Agg.TotalSpent, Agg.PurchaseCount
FROM CUSTOMER C
JOIN (
SELECT CustId, SUM(SalePrice) AS TotalSpent, COUNT(*) AS PurchaseCount
FROM SALE
GROUP BY CustId
) Agg ON C.CustId = Agg.CustId
WHERE Agg.TotalSpent > 500000;
Q276 Find cars that customers bought together.
SELECT DISTINCT C.CustName, I1.CarName AS Car1, I2.CarName AS Car2
FROM CUSTOMER C
JOIN SALE S1 ON C.CustId = S1.CustId
JOIN INVENTORY I1 ON S1.CarId = I1.CarId
JOIN SALE S2 ON C.CustId = S2.CustId AND S1.InvoiceNo != S2.InvoiceNo
JOIN INVENTORY I2 ON S2.CarId = I2.CarId
WHERE I1.CarName < I2.CarName
ORDER BY C.CustName;
Q277 Join to find employee customer preferences.
SELECT E.EmpName, C.CustName, COUNT(*) AS Interactions
FROM EMPLOYEE E
JOIN SALE S ON E.EmpID = S.EmpID
JOIN CUSTOMER C ON S.CustId = C.CustId
GROUP BY E.EmpName, C.CustName
HAVING COUNT(*) > 1
ORDER BY Interactions DESC;
Q278 Join with date range conditions.
SELECT C.CustName, I.CarName, S.SaleDate
FROM CUSTOMER C
JOIN SALE S ON C.CustId = S.CustId
JOIN INVENTORY I ON S.CarId = I.CarId
WHERE S.SaleDate BETWEEN '2019-01-01' AND '2019-12-31'
AND I.FuelType = 'Petrol'
ORDER BY S.SaleDate;
Q279 Find sales with employee and customer details.
SELECT S.InvoiceNo, S.SaleDate, E.EmpName AS SalesPerson, C.CustName AS Customer,
I.CarName, S.SalePrice, S.PaymentMode
FROM SALE S
JOIN EMPLOYEE E ON S.EmpID = E.EmpID
JOIN CUSTOMER C ON S.CustId = C.CustId
JOIN INVENTORY I ON S.CarId = I.CarId
WHERE S.SalePrice > 500000
ORDER BY S.SaleDate DESC;
Q280 Complex join with multiple aggregations.
SELECT E.EmpName,
COUNT(DISTINCT C.CustId) AS UniqueCustomers,
COUNT(DISTINCT I.CarId) AS UniqueCarsSold,
COUNT(S.InvoiceNo) AS TotalSales,
SUM(S.SalePrice) AS Revenue,
AVG(S.SalePrice) AS AvgSale
FROM EMPLOYEE E
JOIN SALE S ON E.EmpID = S.EmpID
JOIN CUSTOMER C ON S.CustId = C.CustId
JOIN INVENTORY I ON S.CarId = I.CarId
GROUP BY E.EmpName
ORDER BY Revenue DESC;
SECTION 25: PERFORMANCE TUNING Q281-Q295
Q281 Optimize slow query with proper indexing.
-- Before optimization
SELECT * FROM SALE WHERE YEAR(SaleDate) = 2019;
-- After optimization (use range condition)
SELECT * FROM SALE WHERE SaleDate BETWEEN '2019-01-01' AND '2019-12-31';
-- Add index on SaleDate
CREATE INDEX idx_sale_date ON SALE(SaleDate);
Q282 Use covering index for query performance.
-- Create covering index
CREATE INDEX idx_covering ON SALE(EmpID, SaleDate, SalePrice);
-- Query that can use covering index
SELECT EmpID, SaleDate, SalePrice
FROM SALE
WHERE EmpID = 'E001' AND SaleDate > '2019-01-01';
Q283 Optimize JOIN query with proper indexes.
-- Create indexes on foreign keys
CREATE INDEX idx_sale_carid ON SALE(CarId);
CREATE INDEX idx_sale_custid ON SALE(CustId);
CREATE INDEX idx_sale_empid ON SALE(EmpID);
-- Optimized query
SELECT S.*, I.CarName, C.CustName
FROM SALE S
JOIN INVENTORY I ON S.CarId = I.CarId
JOIN CUSTOMER C ON S.CustId = C.CustId
WHERE S.SaleDate > '2020-01-01';
Q284 Use query rewriting for better performance.
-- Slow query with NOT IN
SELECT * FROM INVENTORY
WHERE CarId NOT IN (SELECT DISTINCT CarId FROM SALE);
-- Optimized using NOT EXISTS
SELECT I.* FROM INVENTORY I
WHERE NOT EXISTS (SELECT 1 FROM SALE S WHERE S.CarId = I.CarId);
Q285 Use LIMIT for pagination optimization.
-- Pagination query
SELECT * FROM SALE
ORDER BY SaleDate DESC
LIMIT 100 OFFSET 1000;
-- Better with seek method
SELECT * FROM SALE
WHERE SaleDate < '2020-01-15'
ORDER BY SaleDate DESC
LIMIT 100;
Q286 Optimize COUNT queries.
-- Slow COUNT with condition
SELECT COUNT(*) FROM SALE WHERE PaymentMode = 'Cash';
-- Optimized with index on PaymentMode
CREATE INDEX idx_payment ON SALE(PaymentMode);
SELECT COUNT(*) FROM SALE WHERE PaymentMode = 'Cash';
Q287 Use batch processing for large updates.
-- Batch update procedure
DELIMITER //
CREATE PROCEDURE BatchUpdateCommissions(IN batch_size INT)
BEGIN
DECLARE done INT DEFAULT FALSE;
DECLARE batch_count INT DEFAULT 0;
REPEAT
UPDATE SALE
SET Commission = SalePrice * 0.12
WHERE Commission IS NULL
LIMIT batch_size;
SET batch_count = ROW_COUNT();
UNTIL batch_count = 0 END REPEAT;
END //
DELIMITER ;
CALL BatchUpdateCommissions(1000);
Q288 Use partition pruning for better performance.
-- Create partitioned table
CREATE TABLE SALE_BY_YEAR (
InvoiceNo VARCHAR(10),
CarId VARCHAR(10),
SaleDate DATE,
SalePrice DECIMAL(10,2)
)
PARTITION BY RANGE (YEAR(SaleDate)) (
PARTITION p2018 VALUES LESS THAN (2019),
PARTITION p2019 VALUES LESS THAN (2020),
PARTITION p2020 VALUES LESS THAN (2021),
PARTITION p2021 VALUES LESS THAN (2022)
);
-- Query that uses partition pruning
SELECT * FROM SALE_BY_YEAR
WHERE SaleDate BETWEEN '2019-01-01' AND '2019-12-31';
Q289 Use materialized views for frequent queries.
-- Create a summary table
CREATE TABLE DailySalesSummary AS
SELECT SaleDate,
COUNT(*) AS TotalSales,
SUM(SalePrice) AS Revenue,
AVG(SalePrice) AS AvgPrice
FROM SALE
GROUP BY SaleDate;
-- Add index on the summary table
CREATE INDEX idx_summary_date ON DailySalesSummary(SaleDate);
-- Query the summary instead of base table
SELECT * FROM DailySalesSummary
WHERE SaleDate BETWEEN '2020-01-01' AND '2020-01-31';
Q290 Optimize LIKE queries with full-text search.
-- Slow LIKE query
SELECT * FROM CUSTOMER WHERE CustName LIKE '%singh%';
-- Create full-text index
ALTER TABLE CUSTOMER ADD FULLTEXT INDEX ft_name (CustName);
-- Use full-text search
SELECT * FROM CUSTOMER
WHERE MATCH(CustName) AGAINST('singh' IN NATURAL LANGUAGE MODE);
Q291 Use derived tables for complex aggregations.
SELECT D.EmpID, D.SaleYear, D.TotalSales
FROM (
SELECT EmpID, YEAR(SaleDate) AS SaleYear, SUM(SalePrice) AS TotalSales
FROM SALE
GROUP BY EmpID, YEAR(SaleDate)
) D
WHERE D.TotalSales > 500000
ORDER BY D.TotalSales DESC;
Q292 Optimize OR conditions with UNION.
-- Slow OR query
SELECT * FROM INVENTORY
WHERE CarName = 'SWIFT' OR CarName = 'BALENO';
-- Optimized with UNION
SELECT * FROM INVENTORY WHERE CarName = 'SWIFT'
UNION ALL
SELECT * FROM INVENTORY WHERE CarName = 'BALENO';
Q293 Use EXISTS for existence checks.
-- Slow with COUNT
SELECT * FROM CUSTOMER C
WHERE (SELECT COUNT(*) FROM SALE S WHERE S.CustId = C.CustId) > 0;
-- Optimized with EXISTS
SELECT * FROM CUSTOMER C
WHERE EXISTS (SELECT 1 FROM SALE S WHERE S.CustId = C.CustId);
Q294 Use CASE for conditional aggregations.
-- Slow with multiple queries
SELECT
(SELECT SUM(SalePrice) FROM SALE WHERE PaymentMode = 'Cash') AS CashTotal,
(SELECT SUM(SalePrice) FROM SALE WHERE PaymentMode = 'Credit Card') AS CreditTotal;
-- Optimized with CASE
SELECT
SUM(CASE WHEN PaymentMode = 'Cash' THEN SalePrice ELSE 0 END) AS CashTotal,
SUM(CASE WHEN PaymentMode = 'Credit Card' THEN SalePrice ELSE 0 END) AS CreditTotal
FROM SALE;
Q295 Use SHOW PROFILE for query analysis.
-- Enable profiling
SET profiling = 1;
-- Run your query
SELECT * FROM SALE S
JOIN CUSTOMER C ON S.CustId = C.CustId
WHERE S.SalePrice > 500000;
-- Show profile
SHOW PROFILES;
SHOW PROFILE FOR QUERY 1;
SECTION 26: FINAL CHALLENGE Q296-Q305
Q296 Complete business intelligence dashboard query.
SELECT
'Total Revenue' AS Metric,
FORMAT(SUM(SalePrice), 0) AS Value,
CONCAT(ROUND((SUM(SalePrice) - LAG(SUM(SalePrice), 1) OVER ()) * 100.0 / LAG(SUM(SalePrice), 1) OVER (), 1), '%') AS YoY_Growth
FROM SALE
WHERE YEAR(SaleDate) >= YEAR(CURDATE()) - 1
UNION ALL
SELECT 'Active Customers', COUNT(DISTINCT CustId), NULL
FROM SALE
WHERE YEAR(SaleDate) = YEAR(CURDATE())
UNION ALL
SELECT 'Cars Sold', COUNT(*), NULL
FROM SALE
WHERE YEAR(SaleDate) = YEAR(CURDATE())
UNION ALL
SELECT 'Top Employee', EmpName, NULL
FROM (
SELECT E.EmpName, SUM(S.SalePrice) AS TotalSales,
RANK() OVER (ORDER BY SUM(S.SalePrice) DESC) AS RankNum
FROM EMPLOYEE E
JOIN SALE S ON E.EmpID = S.EmpID
WHERE YEAR(S.SaleDate) = YEAR(CURDATE())
GROUP BY E.EmpName
) T WHERE RankNum = 1
UNION ALL
SELECT 'Top Customer', CustName, NULL
FROM (
SELECT C.CustName, SUM(S.SalePrice) AS TotalSpent,
RANK() OVER (ORDER BY SUM(S.SalePrice) DESC) AS RankNum
FROM CUSTOMER C
JOIN SALE S ON C.CustId = S.CustId
WHERE YEAR(S.SaleDate) = YEAR(CURDATE())
GROUP BY C.CustName
) T WHERE RankNum = 1;
Q297 Complete sales forecasting query.
WITH MonthlyTrend AS (
SELECT DATE_FORMAT(SaleDate, '%Y-%m') AS Month,
SUM(SalePrice) AS Revenue,
ROW_NUMBER() OVER (ORDER BY DATE_FORMAT(SaleDate, '%Y-%m')) AS RowNum
FROM SALE
WHERE SaleDate >= DATE_SUB(CURDATE(), INTERVAL 12 MONTH)
GROUP BY DATE_FORMAT(SaleDate, '%Y-%m')
),
Trendline AS (
SELECT
AVG(Revenue) AS AvgRevenue,
(SUM(RowNum * Revenue) - SUM(RowNum) * AVG(Revenue)) /
(SUM(RowNum * RowNum) - SUM(RowNum) * AVG(RowNum)) AS Slope
FROM MonthlyTrend
)
SELECT
CONCAT('Next Month Forecast: ₹',
FORMAT(AvgRevenue + Slope * (MAX(RowNum) + 1), 0)) AS Forecast
FROM MonthlyTrend, Trendline;
Q298 Complete customer segmentation analysis.
WITH CustomerSegments AS (
SELECT CustId,
SUM(SalePrice) AS TotalSpent,
COUNT(*) AS PurchaseCount,
AVG(SalePrice) AS AvgPurchase,
DATEDIFF(CURDATE(), MAX(SaleDate)) AS DaysSinceLast,
NTILE(4) OVER (ORDER BY SUM(SalePrice) DESC) AS SpendingTier,
NTILE(4) OVER (ORDER BY COUNT(*) DESC) AS FrequencyTier
FROM SALE
GROUP BY CustId
)
SELECT
CASE
WHEN SpendingTier <= 2 AND FrequencyTier <= 2 THEN 'VIP'
WHEN SpendingTier <= 2 THEN 'High Spender'
WHEN FrequencyTier <= 2 THEN 'Frequent Buyer'
ELSE 'Regular'
END AS Segment,
COUNT(*) AS CustomerCount,
AVG(TotalSpent) AS AvgLifetimeValue,
AVG(PurchaseCount) AS AvgPurchases,
AVG(DaysSinceLast) AS AvgDaysSinceLast
FROM CustomerSegments
GROUP BY Segment
ORDER BY AvgLifetimeValue DESC;
Q299 Complete product recommendation system.
WITH PurchasedPairs AS (
SELECT S1.CustId, S1.CarId AS Car1, S2.CarId AS Car2, COUNT(*) AS Frequency
FROM SALE S1
JOIN SALE S2 ON S1.CustId = S2.CustId AND S1.CarId < S2.CarId
GROUP BY S1.CustId, S1.CarId, S2.CarId
),
ProductAffinity AS (
SELECT Car1, Car2,
COUNT(DISTINCT CustId) AS SharedCustomers,
ROUND(COUNT(DISTINCT CustId) * 100.0 /
(SELECT COUNT(DISTINCT CustId) FROM SALE WHERE CarId = Car1), 2) AS AffinityScore
FROM PurchasedPairs
GROUP BY Car1, Car2
HAVING SharedCustomers > 1
)
SELECT I1.CarName AS Product, I2.CarName AS RecommendedProduct, PA.AffinityScore
FROM ProductAffinity PA
JOIN INVENTORY I1 ON PA.Car1 = I1.CarId
JOIN INVENTORY I2 ON PA.Car2 = I2.CarId
ORDER BY PA.AffinityScore DESC
LIMIT 20;
Q300 Complete anomaly detection query.
WITH DailyStats AS (
SELECT SaleDate,
SUM(SalePrice) AS DailyRevenue,
AVG(SUM(SalePrice)) OVER (ORDER BY SaleDate ROWS BETWEEN 7 PRECEDING AND 1 PRECEDING) AS MovingAvg,
STD(SUM(SalePrice)) OVER (ORDER BY SaleDate ROWS BETWEEN 7 PRECEDING AND 1 PRECEDING) AS MovingStd
FROM SALE
GROUP BY SaleDate
)
SELECT SaleDate, DailyRevenue, MovingAvg, MovingStd,
CASE
WHEN ABS(DailyRevenue - MovingAvg) > 3 * MovingStd THEN 'Critical Anomaly'
WHEN ABS(DailyRevenue - MovingAvg) > 2 * MovingStd THEN 'Potential Anomaly'
ELSE 'Normal'
END AS AnomalyStatus
FROM DailyStats
WHERE MovingAvg IS NOT NULL
ORDER BY SaleDate DESC;
Q301 Complete employee performance scorecard.
WITH EmployeeMetrics AS (
SELECT E.EmpID, E.EmpName,
COUNT(S.InvoiceNo) AS SalesCount,
SUM(S.SalePrice) AS TotalRevenue,
AVG(S.SalePrice) AS AvgSale,
COUNT(DISTINCT S.CustId) AS UniqueCustomers,
SUM(S.Commission) AS TotalCommission
FROM EMPLOYEE E
LEFT JOIN SALE S ON E.EmpID = S.EmpID
GROUP BY E.EmpID, E.EmpName
),
Scorecard AS (
SELECT *,
PERCENT_RANK() OVER (ORDER BY TotalRevenue DESC) * 100 AS RevenueScore,
PERCENT_RANK() OVER (ORDER BY SalesCount DESC) * 100 AS VolumeScore,
PERCENT_RANK() OVER (ORDER BY AvgSale DESC) * 100 AS EfficiencyScore
FROM EmployeeMetrics
)
SELECT EmpName,
TotalRevenue,
SalesCount,
AvgSale,
ROUND((RevenueScore + VolumeScore + EfficiencyScore) / 3, 2) AS OverallScore,
CASE
WHEN (RevenueScore + VolumeScore + EfficiencyScore) / 3 >= 80 THEN 'Top Performer'
WHEN (RevenueScore + VolumeScore + EfficiencyScore) / 3 >= 60 THEN 'Strong Performer'
WHEN (RevenueScore + VolumeScore + EfficiencyScore) / 3 >= 40 THEN 'Adequate Performer'
ELSE 'Needs Improvement'
END AS PerformanceRating
FROM Scorecard
ORDER BY OverallScore DESC;
Q302 Complete market basket analysis.
WITH Basket AS (
SELECT S1.CustId, S1.CarId AS CarA, S2.CarId AS CarB
FROM SALE S1
JOIN SALE S2 ON S1.CustId = S2.CustId AND S1.CarId < S2.CarId
),
BasketStats AS (
SELECT CarA, CarB,
COUNT(*) AS Frequency,
(SELECT COUNT(DISTINCT CustId) FROM SALE WHERE CarId = CarA) AS SupportA,
(SELECT COUNT(DISTINCT CustId) FROM SALE WHERE CarId = CarB) AS SupportB,
(SELECT COUNT(DISTINCT CustId) FROM SALE) AS TotalCustomers
FROM Basket
GROUP BY CarA, CarB
)
SELECT I1.CarName AS ProductA, I2.CarName AS ProductB,
ROUND(Frequency * 100.0 / SupportA, 2) AS Confidence_A_to_B,
ROUND(Frequency * 100.0 / TotalCustomers, 2) AS Support,
ROUND((Frequency * 1.0 / TotalCustomers) / (SupportA * 1.0 / TotalCustomers * SupportB * 1.0 / TotalCustomers), 2) AS Lift
FROM BasketStats BS
JOIN INVENTORY I1 ON BS.CarA = I1.CarId
JOIN INVENTORY I2 ON BS.CarB = I2.CarId
WHERE Frequency > 2
ORDER BY Lift DESC
LIMIT 20;
Q303 Complete sales pipeline analysis.
SELECT
CASE
WHEN DATEDIFF(CURDATE(), SaleDate) <= 30 THEN 'Hot Lead'
WHEN DATEDIFF(CURDATE(), SaleDate) <= 90 THEN 'Warm Lead'
WHEN DATEDIFF(CURDATE(), SaleDate) <= 180 THEN 'Cold Lead'
ELSE 'Lost'
END AS PipelineStage,
COUNT(*) AS Opportunities,
SUM(SalePrice) AS PotentialValue,
AVG(SalePrice) AS AvgDealSize,
ROUND(COUNT(*) * 100.0 / (SELECT COUNT(*) FROM SALE), 2) AS Percentage
FROM SALE
WHERE YEAR(SaleDate) = YEAR(CURDATE())
GROUP BY PipelineStage
ORDER BY FIELD(PipelineStage, 'Hot Lead', 'Warm Lead', 'Cold Lead', 'Lost');
Q304 Complete financial performance analysis.
SELECT
YEAR(SaleDate) AS FiscalYear,
COUNT(*) AS UnitsSold,
SUM(SalePrice) AS GrossRevenue,
SUM(I.Price * 0.70) AS COGS,
SUM(SalePrice) - SUM(I.Price * 0.70) AS GrossProfit,
ROUND((SUM(SalePrice) - SUM(I.Price * 0.70)) * 100.0 / SUM(SalePrice), 2) AS GrossMargin,
SUM(S.Commission) AS TotalCommission,
(SUM(SalePrice) - SUM(I.Price * 0.70) - SUM(S.Commission)) AS NetProfit,
ROUND((SUM(SalePrice) - SUM(I.Price * 0.70) - SUM(S.Commission)) * 100.0 / SUM(SalePrice), 2) AS NetMargin
FROM SALE S
JOIN INVENTORY I ON S.CarId = I.CarId
LEFT JOIN EMPLOYEE E ON S.EmpID = E.EmpID
GROUP BY YEAR(SaleDate)
ORDER BY FiscalYear;
Q305 Complete data governance and quality report.
SELECT 'Data Quality Report' AS ReportTitle, CURDATE() AS ReportDate
UNION ALL
SELECT 'Table', 'Total Records', 'Missing Values', 'Unique Values', 'Data Completeness'
UNION ALL
SELECT 'CUSTOMER',
CAST(COUNT(*) AS CHAR),
CAST(SUM(CASE WHEN CustName IS NULL OR Phone IS NULL THEN 1 ELSE 0 END) AS CHAR),
CAST(COUNT(DISTINCT CustId) AS CHAR),
CONCAT(ROUND(100 - SUM(CASE WHEN CustName IS NULL OR Phone IS NULL THEN 1 ELSE 0 END) * 100.0 / COUNT(*), 2), '%')
FROM CUSTOMER
UNION ALL
SELECT 'INVENTORY',
CAST(COUNT(*) AS CHAR),
CAST(SUM(CASE WHEN Price IS NULL OR CarName IS NULL THEN 1 ELSE 0 END) AS CHAR),
CAST(COUNT(DISTINCT CarId) AS CHAR),
CONCAT(ROUND(100 - SUM(CASE WHEN Price IS NULL OR CarName IS NULL THEN 1 ELSE 0 END) * 100.0 / COUNT(*), 2), '%')
FROM INVENTORY
UNION ALL
SELECT 'SALE',
CAST(COUNT(*) AS CHAR),
CAST(SUM(CASE WHEN SalePrice IS NULL OR PaymentMode IS NULL THEN 1 ELSE 0 END) AS CHAR),
CAST(COUNT(DISTINCT InvoiceNo) AS CHAR),
CONCAT(ROUND(100 - SUM(CASE WHEN SalePrice IS NULL OR PaymentMode IS NULL THEN 1 ELSE 0 END) * 100.0 / COUNT(*), 2), '%')
FROM SALE
UNION ALL
SELECT 'EMPLOYEE',
CAST(COUNT(*) AS CHAR),
CAST(SUM(CASE WHEN EmpName IS NULL OR Salary IS NULL THEN 1 ELSE 0 END) AS CHAR),
CAST(COUNT(DISTINCT EmpID) AS CHAR),
CONCAT(ROUND(100 - SUM(CASE WHEN EmpName IS NULL OR Salary IS NULL THEN 1 ELSE 0 END) * 100.0 / COUNT(*), 2), '%')
FROM EMPLOYEE;



0 Comments