You can also use:
WHERE NOT EXISTS (
SELECT 1
FROM ENZYME98DKQ60_CENTURA_LONGMONT_UNITED_HOSPITAL B
WHERE B.Patient_ID = A.Patient_ID
)
Windows functions
**************************************************************************************************
🔥 Windows functions ( Important)
Follow this exact order:
✅ ROW_NUMBER()
✅ RANK(), DENSE_RANK()
✅ NTILE()
✅ PARTITION BY
✅ LAG(), LEAD()
✅ FIRST_VALUE(), LAST_VALUE()
✅ SUM() OVER(), AVG() OVER(), COUNT() OVER()
✅ Running Total
✅ PERCENT_RANK(), CUME_DIST()
✅ Frame Clause
Use data of Statstical function in Excel
--simple row number gives number
SELECT *,
ROW_NUMBER() OVER (ORDER BY Total_Marks DESC) AS RowNum
FROM tbl_Students;
--ranking formula
SELECT *,
RANK() OVER (ORDER BY Total_Marks DESC) AS RankValue
FROM tbl_Students;
SELECT *,
DENSE_RANK() OVER (ORDER BY Total_Marks DESC) AS DenseRankValue
FROM tbl_Students;
SELECT *,
SUM(Total_Marks) OVER (ORDER BY SNO) AS RunningTotal
FROM tbl_Students;
SELECT *,
ROW_NUMBER() OVER (PARTITION BY City ORDER BY Total_Marks DESC) AS CityRank
FROM tbl_Students;
--Rank students within each city
SELECT *,
ROW_NUMBER() OVER (PARTITION BY City ORDER BY Total_Marks DESC) AS CityRank
FROM tbl_Students;
SELECT *,
RANK() OVER (PARTITION BY City ORDER BY Total_Marks DESC) AS CityRank
FROM tbl_Students;
--Rank students inside each year
SELECT *,
RANK() OVER (PARTITION BY Year ORDER BY Total_Marks DESC) AS YearRank
FROM tbl_Students;
SELECT
Name_of_Student,
City,
Total_Marks,
COUNT(*) OVER (PARTITION BY City) AS StudentsInCity
FROM tbl_Students;
SELECT *,
COUNT(*) OVER (PARTITION BY City) AS StudentsInCity
FROM tbl_Students;
-- Ranking per student (overall based on Total_Marks)
SELECT *,
RANK() OVER (ORDER BY Total_Marks DESC) AS OverallRank
FROM tbl_Students;
-- Row number per student (unique ranking, no duplicates)
SELECT *,
ROW_NUMBER() OVER (ORDER BY Total_Marks DESC) AS RowNum
FROM tbl_Students;
-- Dense rank per student (no gaps in ranking)
SELECT *,
DENSE_RANK() OVER (ORDER BY Total_Marks DESC) AS DenseRank
FROM tbl_Students;
-- Ranking students within each city
SELECT *,
RANK() OVER (PARTITION BY City ORDER BY Total_Marks DESC) AS CityRank
FROM tbl_Students;
-- Row number per city (unique sequence within each city)
SELECT *,
ROW_NUMBER() OVER (PARTITION BY City ORDER BY Total_Marks DESC) AS CityRowNum
FROM tbl_Students;
-- Dense rank per city (no gap ranking within city)
SELECT *,
DENSE_RANK() OVER (PARTITION BY City ORDER BY Total_Marks DESC) AS CityDenseRank
FROM tbl_Students;
-- Count of students in each city (shown on every row)
SELECT *,
COUNT(*) OVER (PARTITION BY City) AS StudentsInCity
FROM tbl_Students;
-- Average marks of each city (shown on every row)
SELECT *,
AVG(Total_Marks) OVER (PARTITION BY City) AS CityAverage
FROM tbl_Students;
-- Highest marks in each year
SELECT *,
MAX(Total_Marks) OVER (PARTITION BY Year) AS MaxMarksInYear
FROM tbl_Students;
-- Running total of marks within each city
SELECT *,
SUM(Total_Marks) OVER (PARTITION BY City ORDER BY SNO) AS RunningTotal
FROM tbl_Students;
-- City topper + ranking of all students within city
SELECT *,
RANK() OVER (PARTITION BY City ORDER BY Total_Marks DESC) AS CityRank
FROM tbl_Students;
-- Top student per city (without CTE)
SELECT * FROM (SELECT *, RANK() OVER (PARTITION BY City ORDER BY Total_Marks DESC) AS CityRank FROM tbl_Students ) t
WHERE CityRank = 1;
-- Top 2 students in each city
SELECT *
FROM (
SELECT *,
DENSE_RANK() OVER (PARTITION BY City ORDER BY Total_Marks DESC) AS drnk
FROM tbl_Students
) t
WHERE drnk <= 2;
-- Top 3 students per city without gaps
SELECT *
FROM (
SELECT *,
DENSE_RANK() OVER (PARTITION BY City ORDER BY Total_Marks DESC) AS drnk
FROM tbl_Students
) t
WHERE drnk <= 3;
-- Compare each student with top scorer in their city
SELECT *,
MAX(Total_Marks) OVER (PARTITION BY City) AS CityTopScore,
MAX(Total_Marks) OVER (PARTITION BY City) - Total_Marks AS GapFromTop
FROM tbl_Students;
-- Each student's contribution to city total marks
SELECT *,
SUM(Total_Marks) OVER (PARTITION BY City) AS CityTotal,
ROUND(
(Total_Marks * 100.0) / SUM(Total_Marks) OVER (PARTITION BY City),
2
) AS PercentContribution
FROM tbl_Students;
-- Rank + cumulative marks inside city
SELECT *,
ROW_NUMBER() OVER (PARTITION BY City ORDER BY Total_Marks DESC) AS CityRank,
SUM(Total_Marks) OVER (PARTITION BY City ORDER BY Total_Marks DESC) AS RunningCityScore
FROM tbl_Students;
-- Mark students above or below city average
SELECT *,
AVG(Total_Marks) OVER (PARTITION BY City) AS CityAvg,
CASE
WHEN Total_Marks >= AVG(Total_Marks) OVER (PARTITION BY City)
THEN 'Above Average'
ELSE 'Below Average'
END AS PerformanceStatus
FROM tbl_Students;
-- Top student per city using ROW_NUMBER
SELECT *
FROM (
SELECT *,
ROW_NUMBER() OVER (PARTITION BY City ORDER BY Total_Marks DESC) AS rn
FROM tbl_Students
) t
WHERE rn = 1;
-- Year-wise topper list
SELECT *
FROM (
SELECT *,
RANK() OVER (PARTITION BY Year ORDER BY Total_Marks DESC) AS rnk
FROM tbl_Students
) t
WHERE rnk = 1;
-------------------------Sub query-------------------
-- Students scoring above average marks
SELECT *
FROM tbl_Students
WHERE Total_Marks > (
SELECT AVG(Total_Marks)
FROM tbl_Students
);
-- Student(s) with highest marks
SELECT *
FROM tbl_Students
WHERE Total_Marks = (
SELECT MAX(Total_Marks)
FROM tbl_Students
);
-- Students from Delhi city
SELECT *
FROM tbl_Students
WHERE City = (
SELECT City
FROM tbl_Students
WHERE SNO = 4
);
-- Cities with high average performance
SELECT *
FROM tbl_Students
WHERE City IN (
SELECT City
FROM tbl_Students
GROUP BY City
HAVING AVG(Total_Marks) > 300
);
-- Students scoring above overall average marks
SELECT *
FROM tbl_Students
WHERE Total_Marks > (
SELECT AVG(Total_Marks)
FROM tbl_Students
);
-- Student(s) with highest marks in entire table
SELECT *
FROM tbl_Students
WHERE Total_Marks = (
SELECT MAX(Total_Marks)
FROM tbl_Students
);
-- Students scoring above their city average
SELECT *
FROM tbl_Students s
WHERE Total_Marks > (
SELECT AVG(Total_Marks)
FROM tbl_Students
WHERE City = s.City
);
-- Second highest marks in the class
SELECT MAX(Total_Marks) AS SecondHighest
FROM tbl_Students
WHERE Total_Marks < (
SELECT MAX(Total_Marks)
FROM tbl_Students
);
-- Top 3 marks cutoff using subquery
SELECT *
FROM tbl_Students
WHERE Total_Marks >= (
SELECT MIN(Total_Marks)
FROM (
SELECT DISTINCT TOP 3 Total_Marks
FROM tbl_Students
ORDER BY Total_Marks DESC
) t
);
select * from tbl_Students
select SNO, Name_of_Student,marathi,science,So_Science,English,Sanskrit,Total_Marks,Year,City,Months,Week
from tbl_Students
group by Year, Months
where Year = 2016 and months = 'March'
SELECT SNO, Name_of_Student, Marathi, Science, So_Science, English, Sanskrit,
Total_Marks, Year, City, Months, Week
FROM tbl_Students
WHERE Year = 2016
AND Months = 'March';
group by Year, months
SELECT SNO, Name_of_Student, Marathi, Science, So_Science, English, Sanskrit,
Total_Marks, Year, City, Months, Week
FROM tbl_Students
group by year, months
Medview Scenarios
**************************************************************************************************
SELECT *,
COUNT(Surgical_Procedure) OVER (PARTITION BY State) AS PatientinCity
FROM ENZYMES35OOY91_MEADOWVIEW_REGIONAL_MEDICAL_CENTER
where Reference_Received_Date ='2024-02-23'
SELECT State,
COUNT(Surgical_Procedure) AS PatientinCity
FROM ENZYMES35OOY91_MEADOWVIEW_REGIONAL_MEDICAL_CENTER
WHERE Reference_Received_Date = '2024-02-23'
GROUP BY State;
SELECT State,
Surgical_Procedure,
COUNT(*) OVER (PARTITION BY State) AS TotalPatients,
ROW_NUMBER() OVER (PARTITION BY State ORDER BY Surgical_Procedure) AS RowNum,
RANK() OVER (PARTITION BY State ORDER BY Surgical_Procedure) AS Ranking
FROM ENZYMES35OOY91_MEADOWVIEW_REGIONAL_MEDICAL_CENTER;
SELECT *,
COUNT(Surgical_Procedure) OVER (PARTITION BY State) AS PatientinCity
FROM ENZYMES35OOY91_MEADOWVIEW_REGIONAL_MEDICAL_CENTER
WHERE Reference_Received_Date = '2024-02-23' and Surgical_Procedure = 'Lung Resection';
--ROW_NUMBER() → Unique numbering inside each State
SELECT Patient_ID,
Patient_Name,
State,
Surgical_Procedure,
ROW_NUMBER() OVER
(
PARTITION BY State
ORDER BY Patient_ID
) AS StateWiseRowNumber
FROM ENZYMES35OOY91_MEADOWVIEW_REGIONAL_MEDICAL_CENTER;
--RANK() → Rank patients by Satisfaction Rating
SELECT Patient_Name,
State,
Patient_Satisfaction_Survey_Ratings,
RANK() OVER
(
PARTITION BY State
ORDER BY Patient_Satisfaction_Survey_Ratings DESC
) AS PatientRank
FROM ENZYMES35OOY91_MEADOWVIEW_REGIONAL_MEDICAL_CENTER;
--4️⃣ NTILE() → Divide patients into groups
SELECT Patient_Name,
State,
Body_Weight,
NTILE(4) OVER
(
ORDER BY Body_Weight
) AS WeightQuartile
FROM ENZYMES35OOY91_MEADOWVIEW_REGIONAL_MEDICAL_CENTER;
--5️⃣ COUNT() OVER() → Total surgeries in each State
SELECT Patient_Name,
State,
Surgical_Procedure,
COUNT(*) OVER
(
PARTITION BY State
) AS TotalPatientsInState
FROM ENZYMES35OOY91_MEADOWVIEW_REGIONAL_MEDICAL_CENTER;
--6️⃣ AVG() OVER() → Average Satisfaction by State
SELECT Patient_Name,
State,
Patient_Satisfaction_Survey_Ratings,
AVG(Patient_Satisfaction_Survey_Ratings) OVER
(
PARTITION BY State
) AS AvgStateRating
FROM ENZYMES35OOY91_MEADOWVIEW_REGIONAL_MEDICAL_CENTER;
--7️⃣ Running Total using SUM()
SELECT Patient_ID,
State,
Patient_Satisfaction_Survey_Ratings,
SUM(Patient_Satisfaction_Survey_Ratings) OVER
(
PARTITION BY State
ORDER BY Patient_ID
) AS RunningTotal
FROM ENZYMES35OOY91_MEADOWVIEW_REGIONAL_MEDICAL_CENTER;
--1️⃣5️⃣ Complex Example (Multiple Windows Together)
WITH CTE AS
(
SELECT Patient_Name,
State,
Patient_Satisfaction_Survey_Ratings,
ROW_NUMBER() OVER
(
PARTITION BY State
ORDER BY Patient_Satisfaction_Survey_Ratings DESC
) AS RN
FROM ENZYMES35OOY91_MEADOWVIEW_REGIONAL_MEDICAL_CENTER
)
SELECT *
FROM CTE
WHERE RN = 1;
--👉 What it does
--Divides data into separate groups for each State
--Sorts patients by highest satisfaction rating
--Gives unique sequential numbers
SELECT Patient_ID,
Patient_Name,
State,
Surgical_Procedure,
Patient_Satisfaction_Survey_Ratings,
ROW_NUMBER() OVER
(
PARTITION BY State
ORDER BY Patient_Satisfaction_Survey_Ratings DESC
) AS RowNum,
RANK() OVER
(
PARTITION BY State
ORDER BY Patient_Satisfaction_Survey_Ratings DESC
) AS Ranking,
AVG(Patient_Satisfaction_Survey_Ratings) OVER
(
PARTITION BY State
) AS AvgRating,
COUNT(*) OVER
(
PARTITION BY State
) AS TotalPatients
FROM ENZYMES35OOY91_MEADOWVIEW_REGIONAL_MEDICAL_CENTER;
--1️⃣ Top 3 Highest Rated Patients in Every State
WITH PatientRanking AS
(
SELECT Patient_ID,
Patient_Name,
State,
Surgical_Procedure,
Patient_Satisfaction_Survey_Ratings,
ROW_NUMBER() OVER
(
PARTITION BY State
ORDER BY Patient_Satisfaction_Survey_Ratings DESC
) AS RowNum,
RANK() OVER
(
PARTITION BY State
ORDER BY Patient_Satisfaction_Survey_Ratings DESC
) AS Ranking
FROM ENZYMES35OOY91_MEADOWVIEW_REGIONAL_MEDICAL_CENTER
)
SELECT *
FROM PatientRanking
WHERE RowNum <= 3;
--2️⃣ Detect Lowest Performing Patients State-wise
WITH PoorPatients AS
(
SELECT Patient_ID,
Patient_Name,
State,
Patient_Satisfaction_Survey_Ratings,
ROW_NUMBER() OVER
(
PARTITION BY State
ORDER BY Patient_Satisfaction_Survey_Ratings ASC
) AS LowestRow,
RANK() OVER
(
PARTITION BY State
ORDER BY Patient_Satisfaction_Survey_Ratings ASC
) AS LowestRank
FROM ENZYMES35OOY91_MEADOWVIEW_REGIONAL_MEDICAL_CENTER
)
SELECT *
FROM PoorPatients
WHERE LowestRow <= 5;
--3️⃣ Latest Patients by State using Date
WITH LatestPatients AS
(
SELECT Patient_ID,
Patient_Name,
State,
Reference_Received_Date,
ROW_NUMBER() OVER
(
PARTITION BY State
ORDER BY Reference_Received_Date DESC
) AS LatestRow
FROM ENZYMES35OOY91_MEADOWVIEW_REGIONAL_MEDICAL_CENTER
)
SELECT *
FROM LatestPatients
WHERE LatestRow = 1;
--4️⃣ Surgery-wise Ranking inside each State
SELECT Patient_Name,
State,
Surgical_Procedure,
Patient_Satisfaction_Survey_Ratings,
ROW_NUMBER() OVER
(
PARTITION BY State, Surgical_Procedure
ORDER BY Patient_Satisfaction_Survey_Ratings DESC
) AS SurgeryRowNum,
RANK() OVER
(
PARTITION BY State, Surgical_Procedure
ORDER BY Patient_Satisfaction_Survey_Ratings DESC
) AS SurgeryRank
FROM ENZYMES35OOY91_MEADOWVIEW_REGIONAL_MEDICAL_CENTER;
--5️⃣ Complex CASE + Window Function Example
WITH RatingCTE AS
(
SELECT Patient_ID,
Patient_Name,
State,
Surgical_Procedure,
Patient_Satisfaction_Survey_Ratings,
CASE
WHEN Patient_Satisfaction_Survey_Ratings >= 90 THEN 'Excellent'
WHEN Patient_Satisfaction_Survey_Ratings >= 75 THEN 'Good'
WHEN Patient_Satisfaction_Survey_Ratings >= 50 THEN 'Average'
ELSE 'Poor'
END AS RatingCategory,
ROW_NUMBER() OVER
(
PARTITION BY State
ORDER BY Patient_Satisfaction_Survey_Ratings DESC
) AS RowNum,
RANK() OVER
(
PARTITION BY State
ORDER BY Patient_Satisfaction_Survey_Ratings DESC
) AS Ranking
FROM ENZYMES35OOY91_MEADOWVIEW_REGIONAL_MEDICAL_CENTER
)
SELECT *
FROM RatingCTE;
--9️⃣ Running Count inside Each State
SELECT Patient_ID,
Patient_Name,
State,
Reference_Received_Date,
COUNT(*) OVER
(
PARTITION BY State
ORDER BY Reference_Received_Date
) AS RunningPatients
FROM ENZYMES35OOY91_MEADOWVIEW_REGIONAL_MEDICAL_CENTER;
--🔟 Final Advanced Classroom Example
WITH HospitalAnalytics AS
(
SELECT Patient_ID,
Patient_Name,
State,
Surgical_Procedure,
Reference_Received_Date,
Patient_Satisfaction_Survey_Ratings,
CASE
WHEN Patient_Satisfaction_Survey_Ratings >= 90 THEN 'Excellent'
WHEN Patient_Satisfaction_Survey_Ratings >= 70 THEN 'Good'
ELSE 'Needs Improvement'
END AS RatingStatus,
ROW_NUMBER() OVER
(
PARTITION BY State
ORDER BY Patient_Satisfaction_Survey_Ratings DESC
) AS RowNum,
RANK() OVER
(
PARTITION BY State
ORDER BY Patient_Satisfaction_Survey_Ratings DESC
) AS Ranking,
AVG(Patient_Satisfaction_Survey_Ratings) OVER
(
PARTITION BY State
) AS AvgStateRating,
COUNT(*) OVER
(
PARTITION BY State
) AS TotalPatients
FROM ENZYMES35OOY91_MEADOWVIEW_REGIONAL_MEDICAL_CENTER
)
SELECT *
FROM HospitalAnalytics
WHERE Ranking <= 5;
--1️⃣ Department-wise Patient Ranking with Tie Handling
WITH DepartmentAnalytics AS
(
SELECT Patient_ID,
Patient_Name,
State,
Surgical_Procedure,
Patient_Satisfaction_Survey_Ratings,
CASE
WHEN Surgical_Procedure LIKE '%Heart%' THEN 'Cardiology'
WHEN Surgical_Procedure LIKE '%Lung%' THEN 'Pulmonology'
WHEN Surgical_Procedure LIKE '%Brain%' THEN 'Neurology'
ELSE 'General'
END AS Department,
ROW_NUMBER() OVER
(
PARTITION BY State,
CASE
WHEN Surgical_Procedure LIKE '%Heart%' THEN 'Cardiology'
WHEN Surgical_Procedure LIKE '%Lung%' THEN 'Pulmonology'
WHEN Surgical_Procedure LIKE '%Brain%' THEN 'Neurology'
ELSE 'General'
END
ORDER BY Patient_Satisfaction_Survey_Ratings DESC
) AS RowNum,
RANK() OVER
(
PARTITION BY State,
CASE
WHEN Surgical_Procedure LIKE '%Heart%' THEN 'Cardiology'
WHEN Surgical_Procedure LIKE '%Lung%' THEN 'Pulmonology'
WHEN Surgical_Procedure LIKE '%Brain%' THEN 'Neurology'
ELSE 'General'
END
ORDER BY Patient_Satisfaction_Survey_Ratings DESC
) AS Ranking
FROM ENZYMES35OOY91_MEADOWVIEW_REGIONAL_MEDICAL_CENTER
)
SELECT *
FROM DepartmentAnalytics
WHERE Ranking <= 3;
--2️⃣ State-wise Daily Admission Trend Analysis
WITH DailyAdmissions AS
(
SELECT State,
Reference_Received_Date,
COUNT(*) AS DailyPatients
FROM ENZYMES35OOY91_MEADOWVIEW_REGIONAL_MEDICAL_CENTER
GROUP BY State,
Reference_Received_Date
)
SELECT State,
Reference_Received_Date,
DailyPatients,
ROW_NUMBER() OVER
(
PARTITION BY State
ORDER BY DailyPatients DESC
) AS PeakDayRow,
RANK() OVER
(
PARTITION BY State
ORDER BY DailyPatients DESC
) AS PeakDayRank
FROM DailyAdmissions;
--6️⃣ Find Most Common Surgery per State
WITH SurgeryCounts AS
(
SELECT State,
Surgical_Procedure,
COUNT(*) AS TotalSurgeries
FROM ENZYMES35OOY91_MEADOWVIEW_REGIONAL_MEDICAL_CENTER
GROUP BY State,
Surgical_Procedure
),
RankedSurgeries AS
(
SELECT *,
ROW_NUMBER() OVER
(
PARTITION BY State
ORDER BY TotalSurgeries DESC
) AS RowNum,
RANK() OVER
(
PARTITION BY State
ORDER BY TotalSurgeries DESC
) AS Ranking
FROM SurgeryCounts
)
SELECT *
FROM RankedSurgeries
WHERE RowNum = 1;
Jersy Scenarios
**************************************************************************************************
select *, rank() over(partition by Chief_Complaint order by Visit_Date_and_Time ) as Ranks from ENZYME42IDG24_JERSEY_CITY_MEDICAL_CENTER where Visit_Date_and_Time = '2026-03-22'
SELECT *,
ROW_NUMBER() OVER (
PARTITION BY Primary_Care_Physician
ORDER BY Visit_Date_and_Time
) AS VisitOrder
FROM ENZYME42IDG24_JERSEY_CITY_MEDICAL_CENTER;
SELECT *,
SUM(Past_Emergency_Visits) OVER (
PARTITION BY Patient_ID
) AS Total_Billing,
AVG(Past_Emergency_Visits) OVER (
PARTITION BY Patient_ID
) AS Avg_Billing,
COUNT(*) OVER (
PARTITION BY Patient_ID
) AS Visit_Count
FROM ENZYME42IDG24_JERSEY_CITY_MEDICAL_CENTER;
Dynamic Query
**************************************************************************************************
Great 👍 let’s start with simple and clear examples so your students can understand the concept of Dynamic SQL step by step.
🔹 What is Dynamic SQL?
Dynamic SQL means building a SQL query as a string and executing it at runtime.
Instead of writing:
We create it dynamically:
🔹 1. Basic Dynamic Query (Hardcoded Value)
👉 Simple example to show how EXEC works.
🔹 2. Dynamic WHERE Condition (User Input)
👉 Teach:
-
String concatenation
-
Quotes handling (
'')
🔹 3. Dynamic Column Selection
👉 Useful when user selects column from UI.
🔹 4. Dynamic Table Name
👉 Explain:
-
Useful in multi-table systems
🔹 5. Dynamic ORDER BY
🔹 6. Using sp_executesql (BEST PRACTICE ✅)
👉 Teach this clearly:
-
Prevents SQL Injection
-
Better performance
🔹 7. Dynamic Query with Multiple Filters
👉 Important concept:
-
WHERE 1=1 trick for dynamic conditions
🔹 Teaching Tips for Your Class 🎯
Start in this order:
-
Static query
-
Simple dynamic (
EXEC)
-
Concatenation
-
Problems (quotes, injection)
-
Then introduce
sp_executesql
If you want next level 🚀
I can create:
-
Real-world stored procedure example
-
Student practice questions
-
Dynamic pivot example (very useful in interviews)
Just tell me 👍
create dynamic queries bases on excel file I iuploaed
Got it 👍 — I couldn’t reliably read your .xls file in this environment, but no problem. I’ll still create realistic dynamic SQL examples based on a typical Excel structure, and you can easily map them to your file.
🎯 Assume your Excel table looks like this (very common)
Table: StudentsData
🔥 Dynamic SQL Examples (Based on Excel Data)
🔹 1. Dynamic Filter (Based on Excel Input Cell)
👉 Example: User selects City in Excel → pass to SQL
🔹 2. Dynamic Multiple Filters (Excel Form Scenario)
👉 Suppose Excel has filters:
👉 Perfect for teaching search forms
🔹 3. Dynamic Column Selection (User selects column in Excel)
👉 Example: User selects "Fees" or "Name"
🔹 4. Dynamic Sorting (Excel Dropdown → Sort Option)
🔹 5. Dynamic Date Filter (Very Practical 🔥)
🔹 6. Best Practice Version (sp_executesql ✅)
👉 Teach this as professional way
🔹 7. Dynamic Table (Multiple Excel Sheets)
👉 Suppose:
-
Sheet1 → Students2023
-
Sheet2 → Students2024
🎓 Classroom Teaching Idea (Very Powerful 💡)
Give students this task:
👉 “Create a dynamic search query where user can filter by:
This combines everything:
-
WHERE 1=1
-
Conditions
-
Concatenation
⚠️ Important Concept to Teach
❌ Bad (SQL Injection risk)
✅ Good
🚀 If you want next level
I can:
-
Use your actual Excel file columns (if you re-upload as
.xlsx)
-
Create stored procedure for your exact data
-
Build real-time Excel + SQL integration example
-
Give student assignment sheet + answers
Just tell me 👍
For providence Hospi
**************************************************************************************************
select * from ENZYME24TWA02_PROVIDENCE_NEWBERG_MEDICAL_CENTER order by Reference_Added_Date desc
--🔹 1. Select Patients
SELECT Patient_ID, [Patient_Name ], Age, Gender
FROM tblPatient_Infomation;
--🔹 2. Filter Patients (Age > 40)
SELECT [Patient_Name ], Age, Gender
FROM tblPatient_Infomation
WHERE Age > 40
group by [Patient_Name ], Age, Gender
--🔹 3. Procedures with High Cost
SELECT [Procedure_ID ], Cost
FROM [tbProcedures Table]
WHERE Cost > 5000;
--🔹 4. Paid Bills Only
SELECT *
FROM [tblBiling Table]
WHERE [Payment_Status ] = 'Paid';
--🔹 4. Paid Bills Only
SELECT
[Patient_ID ],
SUM([Total_Amount ]) AS Total_Billing
FROM [tblBiling Table]
GROUP BY [Patient_ID ];
--🔹 6. Average Procedure Cost
SELECT
AVG(Cost) AS Avg_Procedure_Cost
FROM [tbProcedures Table];
--🔹 7. Count Reports by Status
SELECT
[Report_Status ],
COUNT(*) AS Total_Reports
FROM [tblReports Table]
GROUP BY [Report_Status ];
--🔹 8. Doctors with Experience > 10 Years
SELECT
[Doctor_Name ], [Experience_Years ]
FROM [tblDoctore Information]
WHERE [Experience_Years ] > 10;
-------------------------------------JOINS----------------------
--🔹 9. Patient + Procedure
SELECT
P.[Patient_Name ],
Pr.[Procedure_Name ],
Pr.Cost
FROM [tblPatient_Infomation] P
JOIN [tbProcedures Table] Pr
ON P.Patient_ID = Pr.[Patient_ID ];
--🔹 10. Patient + Billing
SELECT
P.[Patient_Name ],
B.[Total_Amount ],
B.[Payment_Status ]
FROM [tblPatient_Infomation] P
JOIN [tblBiling Table] B
ON P.Patient_ID = B.[Patient_ID ];
--🔹 11. Procedure + Report
SELECT
Pr.[Procedure_Name ],
R.[Report_Status ],
R.[Severity_Score ]
FROM [tbProcedures Table] Pr
JOIN [tblReports Table] R
ON Pr.[Procedure_ID ] = R.[Procedure_ID ];
--🔹 12. Total Revenue + Avg Procedure Time per Patient ( Errr0r)
SELECT
P.[Patient_Name ],
SUM(B.[Total_Amount ]) AS Total_Revenue,
AVG(Pr.[Duration_Minutes ]) AS Avg_Time
FROM [tblPatient_Infomation] P
JOIN [tbProcedures Table] Pr
ON P.Patient_ID = Pr.[Patient_ID ]
JOIN [tblBiling Table] B
ON Pr.[Procedure_ID ] = B.[Procedure_ID ]
GROUP BY P.[Patient_Name ];
--🔹 13. Patients with Pending Payments
SELECT
P.[Patient_Name ],
SUM(B.[Total_Amount ] - B.[Paid_Amount ]) AS Pending_Amount
FROM [tblPatient_Infomation] P
JOIN [tblBiling Table] B
ON P.Patient_ID = B.[Patient_ID ]
GROUP BY P.[Patient_Name ]
HAVING SUM(B.[Total_Amount ] - B.[Paid_Amount ]) > 0;
--🔹 14. Most Expensive Procedure per Patient
SELECT
[Patient_ID ],
MAX(Cost) AS Max_Cost
FROM [tbProcedures Table]
GROUP BY [Patient_ID ];
--🔹 15. Ranking Patients by Billing (Window Function 🔥)
SELECT
[Patient_ID ],
SUM([Total_Amount ]) AS Total_Billing,
RANK() OVER (ORDER BY SUM([Total_Amount ]) DESC) AS Rank_By_Billing
FROM [tblBiling Table]
GROUP BY [Patient_ID ];
--🔹 16. Reports with High Severity
SELECT
[Patient_ID ],
[Severity_Score ],
[Report_Status ]
FROM [tblReports Table]
WHERE [Severity_Score ] > 7;
SELECT
[Imaging Modality],
AVG([Radiation Dose]) AS Avg_Dose
FROM [ENZYME24TWA02_PROVIDENCE_NEWBERG_MEDICAL_CENTER]
GROUP BY [Imaging Modality];
------------------------Advance Level-----------------
--🧠 Q1. Find total revenue, total bills, and average bill amount per patient
SELECT
P.Patient_ID,
P.[Patient_Name ],
COUNT(B.Bill_ID) AS Total_Bills,
SUM(B.[Total_Amount ]) AS Total_Revenue,
AVG(B.[Total_Amount ]) AS Avg_Bill
FROM [tblPatient_Infomation] P
JOIN [tblBiling Table] B
ON P.Patient_ID = B.[Patient_ID ]
GROUP BY
P.Patient_ID,
P.[Patient_Name ]
ORDER BY Total_Revenue DESC;
--🧠 Q2. Find patient procedure stats (count, avg cost, max cost)
SELECT
P.Patient_ID,
P.[Patient_Name ],
COUNT(Pr.[Procedure_ID ]) AS Total_Procedures,
AVG(Pr.Cost) AS Avg_Cost,
MAX(Pr.Cost) AS Max_Cost
FROM [tblPatient_Infomation] P
LEFT JOIN [tbProcedures Table] Pr
ON P.Patient_ID = Pr.[Patient_ID ]
GROUP BY
P.Patient_ID,
P.[Patient_Name ]
ORDER BY Total_Procedures DESC;
--🧠 Q3. Combine billing + procedures (very powerful)
SELECT
P.Patient_ID,
P.[Patient_Name ],
COUNT(DISTINCT Pr.[Procedure_ID ]) AS Total_Procedures,
SUM(B.[Total_Amount ]) AS Total_Billing,
AVG(Pr.Cost) AS Avg_Procedure_Cost
FROM [tblPatient_Infomation] P
JOIN [tbProcedures Table] Pr
ON P.Patient_ID = Pr.[Patient_ID ]
JOIN [tblBiling Table] B
ON Pr.[Procedure_ID ] = B.[Procedure_ID ]
GROUP BY
P.Patient_ID,
P.[Patient_Name ]
ORDER BY Total_Billing DESC;
--🧠 Q4. Pending amount + number of pending bills per patient
SELECT
P.Patient_ID,
P.[Patient_Name ],
COUNT(B.Bill_ID) AS Total_Bills,
SUM(B.[Total_Amount ] - B.[Paid_Amount ]) AS Pending_Amount,
AVG(B.[Total_Amount ] - B.[Paid_Amount ]) AS Avg_Pending
FROM [tblPatient_Infomation] P
JOIN [tblBiling Table] B
ON P.Patient_ID = B.[Patient_ID ]
GROUP BY
P.Patient_ID,
P.[Patient_Name ]
HAVING SUM(B.[Total_Amount ] - B.[Paid_Amount ]) > 0
ORDER BY Pending_Amount DESC;
--🧠 Q5. Report analysis per patient (with severity) Error
SELECT
P.Patient_ID,
P.[Patient_Name ],
COUNT(R.Report_ID) AS Total_Reports,
AVG(R.[Severity_Score ]) AS Avg_Severity,
MAX(R.[Severity_Score ]) AS Max_Severity
FROM [tblPatient_Infomation] P
JOIN [tblReports Table] R
ON P.Patient_ID = R.[Patient_ID ]
GROUP BY
P.Patient_ID,
P.[Patient_Name ]
ORDER BY Avg_Severity DESC;
--🧠 Q6. Patients with no billing (LEFT JOIN case)
SELECT
P.Patient_ID,
P.[Patient_Name ],
COUNT(B.Bill_ID) AS Total_Bills,
ISNULL(SUM(B.[Total_Amount ]),0) AS Total_Billing,
ISNULL(AVG(B.[Total_Amount ]),0) AS Avg_Billing
FROM [tblPatient_Infomation] P
LEFT JOIN [tblBiling Table] B
ON P.Patient_ID = B.[Patient_ID ]
GROUP BY
P.Patient_ID,
P.[Patient_Name ]
HAVING COUNT(B.Bill_ID) = 0;
--🧠 Q7. Full report with date filter (VERY IMPORTANT) Error
SELECT
P.Patient_ID,
P.[Patient_Name ],
COUNT(R.Report_ID) AS Total_Reports,
AVG(R.[Severity_Score ]) AS Avg_Severity,
SUM(B.[Total_Amount ]) AS Total_Billing
FROM [tblPatient_Infomation] P
JOIN [tblReports Table] R
ON P.Patient_ID = R.[Patient_ID ]
JOIN [tblBiling Table] B
ON P.Patient_ID = B.[Patient_ID ]
WHERE R.[Reference_Added_Date ]
BETWEEN '2026-03-01' AND '2026-03-03'
GROUP BY
P.Patient_ID,
P.[Patient_Name ]
ORDER BY Total_Billing DESC;
--🧠 Q1. Find total billing per patient (with patient details)
SELECT
P.Patient_ID,
P.[Patient_Name ],
P.Gender,
P.Age,
SUM(B.[Total_Amount ]) AS Total_Billing
FROM [tblPatient_Infomation] P
JOIN [tblBiling Table] B
ON P.Patient_ID = B.[Patient_ID ]
GROUP BY
P.Patient_ID,
P.[Patient_Name ],
P.Gender,
P.Age
ORDER BY Total_Billing DESC;
--🧠 Q2. Count number of procedures per patient
SELECT
P.Patient_ID,
P.[Patient_Name ],
P.Gender,
Pr.[Procedure_Name ],
COUNT(Pr.[Procedure_ID ]) AS Total_Procedures
FROM [tblPatient_Infomation] P
LEFT JOIN [tbProcedures Table] Pr
ON P.Patient_ID = Pr.[Patient_ID ]
GROUP BY
P.Patient_ID,
P.[Patient_Name ],
P.Gender,
Pr.[Procedure_Name ]
ORDER BY Total_Procedures DESC;
--🧠 Q3. Average procedure cost per patient
SELECT
P.Patient_ID,
P.[Patient_Name ],
P.Age,
Pr.[Procedure_Name ],
AVG(Pr.Cost) AS Avg_Cost
FROM [tblPatient_Infomation] P
JOIN [tbProcedures Table] Pr
ON P.Patient_ID = Pr.[Patient_ID ]
GROUP BY
P.Patient_ID,
P.[Patient_Name ],
P.Age,
Pr.[Procedure_Name ]
ORDER BY Avg_Cost DESC;
--🧠 Q4. Find patients having more than 2 bills
SELECT
P.Patient_ID,
P.[Patient_Name ],
P.Gender,
B.[Payment_Status ],
COUNT(B.Bill_ID) AS Total_Bills
FROM [tblPatient_Infomation] P
JOIN [tblBiling Table] B
ON P.Patient_ID = B.[Patient_ID ]
GROUP BY
P.Patient_ID,
P.[Patient_Name ],
P.Gender,
B.[Payment_Status ]
HAVING COUNT(B.Bill_ID) > 2;
--🧠 Q5. Find average severity score by report status Error
SELECT
R.[Report_Status ],
R.[Patient_ID ],
P.[Patient_Name ],
R.[Findings ],
AVG(R.[Severity_Score ]) AS Avg_Severity
FROM [tblReports Table] R
JOIN [tblPatient_Infomation] P
ON R.[Patient_ID ] = P.Patient_ID
GROUP BY
R.[Report_Status ],
R.[Patient_ID ],
P.[Patient_Name ],
R.[Findings ];
--🧠 Q6. Find total pending amount per patient
SELECT
P.Patient_ID,
P.[Patient_Name ],
B.[Payment_Status ],
B.[Billing_Date ],
SUM(B.[Total_Amount ] - B.[Paid_Amount ]) AS Pending_Amount
FROM [tblPatient_Infomation] P
JOIN [tblBiling Table] B
ON P.Patient_ID = B.[Patient_ID ]
GROUP BY
P.Patient_ID,
P.[Patient_Name ],
B.[Payment_Status ],
B.[Billing_Date ]
HAVING SUM(B.[Total_Amount ] - B.[Paid_Amount ]) > 0;
--🧠 Q7. Count reports within a date range
SELECT
P.Patient_ID,
P.[Patient_Name ],
R.[Report_Status ],
R.[Reference_Added_Date ],
COUNT(R.Report_ID) AS Total_Reports
FROM [tblPatient_Infomation] P
JOIN [tblReports Table] R
ON P.Patient_ID = R.[Patient_ID ]
WHERE R.[Reference_Added_Date ]
BETWEEN '2026-03-01' AND '2026-03-03'
GROUP BY
P.Patient_ID,
P.[Patient_Name ],
R.[Report_Status ],
R.[Reference_Added_Date ];
--🧠 Q8. CONCAT example (Full name style + aggregation)
SELECT
P.Patient_ID,
CONCAT(P.[Patient_Name ], ' - ', P.Gender) AS Patient_Info,
B.[Payment_Status ],
B.[Billing_Date ],
SUM(B.[Total_Amount ]) AS Total_Billing
FROM [tblPatient_Infomation] P
JOIN [tblBiling Table] B
ON P.Patient_ID = B.[Patient_ID ]
GROUP BY
P.Patient_ID,
CONCAT(P.[Patient_Name ], ' - ', P.Gender),
B.[Payment_Status ],
B.[Billing_Date ];
--🧠 Q9. Find procedures with high average cost (> 3000)
SELECT
Pr.[Procedure_Name ],
Pr.[Patient_ID ],
P.[Patient_Name ],
Pr.[Procedure_Date ],
AVG(Pr.Cost) AS Avg_Cost
FROM [tbProcedures Table] Pr
JOIN [tblPatient_Infomation] P
ON Pr.[Patient_ID ] = P.Patient_ID
GROUP BY
Pr.[Procedure_Name ],
Pr.[Patient_ID ],
P.[Patient_Name ],
Pr.[Procedure_Date ]
HAVING AVG(Pr.Cost) > 3000;
--🧠 Q10. Count patients by gender (with extra columns)
SELECT
P.Gender,
P.Age,
P.[Patient_Name ],
P.[Registration_Date ],
COUNT(P.Patient_ID) AS Total_Count
FROM [tblPatient_Infomation] P
GROUP BY
P.Gender,
P.Age,
P.[Patient_Name ],
P.[Registration_Date ]
ORDER BY Total_Count DESC;
--🧠 Q1. Categorize patients based on total billing
SELECT
P.Patient_ID,
P.[Patient_Name ],
SUM(B.[Total_Amount ]) AS Total_Billing,
CASE
WHEN SUM(B.[Total_Amount ]) > 10000 THEN 'High Value'
WHEN SUM(B.[Total_Amount ]) BETWEEN 5000 AND 10000 THEN 'Medium Value'
ELSE 'Low Value'
END AS Patient_Category
FROM [tblPatient_Infomation] P
JOIN [tblBiling Table] B
ON P.Patient_ID = B.[Patient_ID ]
GROUP BY
P.Patient_ID,
P.[Patient_Name ];
--🧠 Q2. Payment status summary (Paid vs Pending)
SELECT
B.[Payment_Status ],
COUNT(B.Bill_ID) AS Total_Bills,
CASE
WHEN B.[Payment_Status ] = 'Paid' THEN 'Completed'
ELSE 'Pending Review'
END AS Status_Remark
FROM [tblBiling Table] B
GROUP BY
B.[Payment_Status ];
--🧠 Q3. Procedure cost category
SELECT
Pr.[Procedure_Name ],
Pr.[Patient_ID ],
Pr.Cost,
CASE
WHEN Pr.Cost > 5000 THEN 'Expensive'
WHEN Pr.Cost BETWEEN 2000 AND 5000 THEN 'Moderate'
ELSE 'Low Cost'
END AS Cost_Category,
COUNT(Pr.[Procedure_ID ]) AS Total_Count
FROM [tbProcedures Table] Pr
GROUP BY
Pr.[Procedure_Name ],
Pr.[Patient_ID ],
Pr.Cost;
--🧠 Q4. Find patients whose billing is above average
SELECT
P.Patient_ID,
P.[Patient_Name ],
B.[Total_Amount ]
FROM [tblPatient_Infomation] P
JOIN [tblBiling Table] B
ON P.Patient_ID = B.[Patient_ID ]
WHERE B.[Total_Amount ] > (
SELECT AVG([Total_Amount ])
FROM [tblBiling Table]
);
--🧠 Q7. Find patients with maximum bill amount
SELECT
P.Patient_ID,
P.[Patient_Name ],
B.[Total_Amount ]
FROM [tblPatient_Infomation] P
JOIN [tblBiling Table] B
ON P.Patient_ID = B.[Patient_ID ]
WHERE B.[Total_Amount ] = (
SELECT MAX([Total_Amount ])
FROM [tblBiling Table]
);
Queries without alias
**************************************************************************************************
🧠 Q1. Find total revenue, total bills, and average bill amount per patient
🧠 Q2. Find patient procedure stats (count, avg cost, max cost)
🧠 Q3. Combine billing + procedures (very powerful)
🧠 Q4. Pending amount + number of pending bills per patient
🧠 Q5. Report analysis per patient (with severity)
🧠 Q6. Patients with no billing (LEFT JOIN case)
🧠 Q7. Full report with date filter (VERY IMPORTANT)
------------------------------------------------------------------------------------------------------------------------------------
SQL SERVER — COMPLETE ROADMAP
╔══════════════════════════════════════════════════════════════════════╗
║ SQL SERVER ║
╚══════════════════════════════════════════════════════════════════════╝
│
├── 01. QUERY BASICS
│ │
│ ├── SELECT
│ │ ├── SELECT
│ │ ├── DISTINCT
│ │ ├── TOP
│ │ ├── Column Aliases (AS)
│ │ ├── Expressions
│ │ ├── CASE
│ │ ├── CAST
│ │ ├── CONVERT
│ │ └── Functions
│ │ ├── String Functions
│ │ ├── Date/Time Functions
│ │ ├── Numeric Functions
│ │ ├── NULL Functions
│ │ └── Conversion Functions
│ │
│ ├── FROM
│ │ ├── Tables
│ │ ├── Views
│ │ ├── Derived Tables
│ │ ├── Table-Valued Functions
│ │ └── Subqueries
│ │
│ └── Query Structure
│ ├── SELECT
│ ├── FROM
│ ├── JOIN
│ ├── WHERE
│ ├── GROUP BY
│ ├── HAVING
│ └── ORDER BY
│
│
├── 02. JOINS
│ │
│ ├── INNER JOIN
│ ├── LEFT JOIN
│ ├── RIGHT JOIN
│ ├── FULL OUTER JOIN
│ ├── CROSS JOIN
│ ├── SELF JOIN
│ └── JOIN Conditions
│ └── ON
│
│
├── 03. FILTERING
│ │
│ └── WHERE
│ │
│ ├── Comparison
│ │ ├── =
│ │ ├── <>
│ │ ├── !=
│ │ ├── >
│ │ ├── <
│ │ ├── >=
│ │ └── <=
│ │
│ ├── Logical
│ │ ├── AND
│ │ ├── OR
│ │ └── NOT
│ │
│ ├── Range
│ │ ├── BETWEEN
│ │ └── NOT BETWEEN
│ │
│ ├── List
│ │ ├── IN
│ │ └── NOT IN
│ │
│ ├── Pattern
│ │ ├── LIKE
│ │ └── NOT LIKE
│ │
│ ├── NULL
│ │ ├── IS NULL
│ │ └── IS NOT NULL
│ │
│ └── Subquery Predicates
│ ├── EXISTS
│ ├── NOT EXISTS
│ ├── ANY
│ ├── SOME
│ └── ALL
│
│
├── 04. GROUPING & AGGREGATION
│ │
│ ├── GROUP BY
│ │ ├── Single Column
│ │ ├── Multiple Columns
│ │ ├── Expressions
│ │ └── ROLLUP
│ │
│ ├── Aggregate Functions
│ │ ├── COUNT()
│ │ ├── COUNT_BIG()
│ │ ├── SUM()
│ │ ├── AVG()
│ │ ├── MIN()
│ │ ├── MAX()
│ │ ├── STDEV()
│ │ ├── STDEVP()
│ │ ├── VAR()
│ │ └── VARP()
│ │
│ └── HAVING
│ ├── Aggregate Conditions
│ ├── GROUP BY Conditions
│ ├── AND
│ ├── OR
│ └── NOT
│
│
├── 05. SORTING & PAGINATION
│ │
│ ├── ORDER BY
│ │ ├── ASC
│ │ ├── DESC
│ │ ├── Multiple Columns
│ │ └── Expressions
│ │
│ ├── TOP
│ │ └── TOP WITH TIES
│ │
│ └── Pagination
│ ├── OFFSET
│ └── FETCH NEXT
│
│
├── 06. SET OPERATORS
│ │
│ ├── UNION
│ ├── UNION ALL
│ ├── INTERSECT
│ └── EXCEPT
│
│
├── 07. SUBQUERIES
│ │
│ ├── By Result Type
│ │ ├── Scalar Subquery
│ │ ├── Single-Row Subquery
│ │ └── Multi-Row Subquery
│ │
│ ├── By Relationship
│ │ ├── Correlated Subquery
│ │ └── Non-Correlated Subquery
│ │
│ ├── By Location
│ │ ├── SELECT
│ │ ├── FROM
│ │ ├── WHERE
│ │ └── HAVING
│ │
│ └── Subquery Operators
│ ├── EXISTS
│ ├── NOT EXISTS
│ ├── IN
│ ├── NOT IN
│ ├── ANY
│ ├── SOME
│ └── ALL
│
│
├── 08. CTE — COMMON TABLE EXPRESSIONS
│ │
│ ├── WITH
│ ├── Non-Recursive CTE
│ ├── Recursive CTE
│ └── Multiple CTEs
│
│
├── 09. WINDOW / ANALYTIC FUNCTIONS
│ │
│ ├── OVER()
│ │ ├── PARTITION BY
│ │ └── ORDER BY
│ │
│ ├── Ranking
│ │ ├── ROW_NUMBER()
│ │ ├── RANK()
│ │ ├── DENSE_RANK()
│ │ └── NTILE()
│ │
│ ├── Offset
│ │ ├── LAG()
│ │ └── LEAD()
│ │
│ └── Window Aggregates
│ ├── SUM() OVER()
│ ├── AVG() OVER()
│ ├── MIN() OVER()
│ ├── MAX() OVER()
│ └── COUNT() OVER()
│
│
├── 10. DATA MANIPULATION — DML
│ │
│ ├── INSERT
│ │ ├── INSERT INTO
│ │ ├── VALUES
│ │ ├── INSERT ... SELECT
│ │ ├── Multiple Rows
│ │ ├── DEFAULT VALUES
│ │ └── OUTPUT
│ │
│ ├── UPDATE
│ │ ├── UPDATE
│ │ ├── SET
│ │ ├── WHERE
│ │ ├── UPDATE + JOIN
│ │ ├── UPDATE + Subquery
│ │ └── OUTPUT
│ │
│ ├── DELETE
│ │ ├── DELETE
│ │ ├── WHERE
│ │ ├── DELETE + JOIN
│ │ ├── DELETE + Subquery
│ │ └── OUTPUT
│ │
│ └── MERGE
│ ├── WHEN MATCHED
│ ├── WHEN NOT MATCHED
│ └── WHEN NOT MATCHED BY SOURCE
│
│
├── 11. DATA TYPES & EXPRESSIONS
│ │
│ ├── Numeric
│ ├── Character / String
│ ├── Date / Time
│ ├── Binary
│ ├── Boolean-like / BIT
│ ├── XML
│ ├── JSON
│ └── User-Defined Types
│
│
├── 12. STRING FUNCTIONS
│ │
│ ├── CONCAT
│ ├── CONCAT_WS
│ ├── LEFT
│ ├── RIGHT
│ ├── SUBSTRING
│ ├── LEN
│ ├── DATALENGTH
│ ├── LOWER
│ ├── UPPER
│ ├── LTRIM
│ ├── RTRIM
│ ├── TRIM
│ ├── REPLACE
│ ├── CHARINDEX
│ ├── PATINDEX
│ └── STRING_SPLIT
│
│
├── 13. DATE & TIME FUNCTIONS
│ │
│ ├── GETDATE()
│ ├── GETUTCDATE()
│ ├── SYSDATETIME()
│ ├── DATEADD()
│ ├── DATEDIFF()
│ ├── DATEDIFF_BIG()
│ ├── DATEPART()
│ ├── DATENAME()
│ ├── DAY()
│ ├── MONTH()
│ ├── YEAR()
│ ├── EOMONTH()
│ ├── DATEFROMPARTS()
│ └── DATETIMEFROMPARTS()
│
│
├── 14. NULL & CONDITIONAL LOGIC
│ │
│ ├── NULL
│ │ ├── IS NULL
│ │ ├── IS NOT NULL
│ │ ├── ISNULL()
│ │ ├── COALESCE()
│ │ └── NULLIF()
│ │
│ └── Conditional
│ ├── CASE
│ │ ├── Simple CASE
│ │ └── Searched CASE
│ ├── IIF()
│ └── CHOOSE()
│
│
├── 15. DATA CONVERSION
│ │
│ ├── CAST()
│ ├── CONVERT()
│ ├── TRY_CAST()
│ └── TRY_CONVERT()
│
│
├── 16. DATABASE OBJECTS — DDL
│ │
│ ├── DATABASE
│ │ ├── CREATE DATABASE
│ │ ├── ALTER DATABASE
│ │ └── DROP DATABASE
│ │
│ ├── TABLE
│ │ ├── CREATE TABLE
│ │ ├── ALTER TABLE
│ │ └── DROP TABLE
│ │
│ ├── VIEW
│ │ ├── CREATE VIEW
│ │ ├── ALTER VIEW
│ │ └── DROP VIEW
│ │
│ ├── INDEX
│ │ ├── CREATE INDEX
│ │ ├── ALTER INDEX
│ │ └── DROP INDEX
│ │
│ ├── PROCEDURE
│ │ ├── CREATE PROCEDURE
│ │ ├── ALTER PROCEDURE
│ │ └── DROP PROCEDURE
│ │
│ ├── FUNCTION
│ │ ├── CREATE FUNCTION
│ │ ├── ALTER FUNCTION
│ │ └── DROP FUNCTION
│ │
│ └── TRIGGER
│ ├── CREATE TRIGGER
│ ├── ALTER TRIGGER
│ └── DROP TRIGGER
│
│
├── 17. CONSTRAINTS
│ │
│ ├── PRIMARY KEY
│ ├── FOREIGN KEY
│ ├── UNIQUE
│ ├── NOT NULL
│ ├── CHECK
│ └── DEFAULT
│
│
├── 18. INDEXES
│ │
│ ├── Clustered Index
│ ├── Nonclustered Index
│ ├── Unique Index
│ ├── Composite Index
│ ├── Included Columns
│ ├── Filtered Index
│ └── Index Fragmentation
│
│
├── 19. VIEWS
│ │
│ ├── Regular Views
│ ├── Indexed Views
│ ├── View Limitations
│ └── View Modification
│
│
├── 20. STORED PROCEDURES
│ │
│ ├── CREATE PROCEDURE
│ ├── ALTER PROCEDURE
│ ├── EXEC / EXECUTE
│ ├── Input Parameters
│ ├── Output Parameters
│ ├── Return Values
│ └── Dynamic SQL
│
│
├── 21. FUNCTIONS
│ │
│ ├── Built-in Functions
│ ├── Scalar Functions
│ ├── Inline Table-Valued Functions
│ ├── Multi-Statement Table-Valued Functions
│ └── User-Defined Functions
│
│
├── 22. TEMPORARY OBJECTS
│ │
│ ├── Temporary Tables
│ │ ├── Local #TempTable
│ │ └── Global ##TempTable
│ │
│ ├── Table Variables
│ └── Temporary Objects
│
│
├── 23. VARIABLES & CONTROL FLOW
│ │
│ ├── Variables
│ │ ├── DECLARE
│ │ ├── SET
│ │ ├── SELECT Assignment
│ │ └── Table Variables
│ │
│ └── Control Flow
│ ├── IF
│ ├── ELSE
│ ├── BEGIN
│ ├── END
│ ├── WHILE
│ ├── BREAK
│ ├── CONTINUE
│ └── RETURN
│
│
├── 24. TRANSACTIONS
│ │
│ ├── BEGIN TRANSACTION
│ ├── COMMIT
│ ├── ROLLBACK
│ ├── SAVE TRANSACTION
│ └── Isolation Levels
│
│
├── 25. ERROR HANDLING
│ │
│ ├── TRY / CATCH
│ │ ├── BEGIN TRY
│ │ ├── END TRY
│ │ ├── BEGIN CATCH
│ │ └── END CATCH
│ │
│ ├── ERROR_NUMBER()
│ ├── ERROR_MESSAGE()
│ ├── ERROR_LINE()
│ └── THROW
│
│
├── 26. DYNAMIC SQL
│ │
│ ├── EXEC()
│ ├── sp_executesql
│ ├── Dynamic Parameters
│ └── SQL Injection
│
│
└── 27. ADVANCED SQL SERVER
│
├── APPLY
│ ├── CROSS APPLY
│ └── OUTER APPLY
│
├── PIVOT
├── UNPIVOT
│
├── Advanced GROUP BY
│ ├── GROUPING SETS
│ ├── ROLLUP
│ └── CUBE
│
├── Recursive Queries
├── JSON
├── XML
├── Full-Text Search
├── Temporal Tables
├── Sequences
├── Identity
├── Synonyms
└── Query Optimization
SQL SERVER — LEARNING LEVELS
╔══════════════════════════════════════════════════════════════════════╗
║ LEVEL 1 — SQL QUERY FUNDAMENTALS ║
╠══════════════════════════════════════════════════════════════════════╣
║ SELECT → FROM → JOIN → WHERE → GROUP BY → HAVING → ORDER BY ║
║ ║
║ Learn: ║
║ • SELECT / DISTINCT / TOP ║
║ • FROM ║
║ • JOIN ║
║ • WHERE ║
║ • GROUP BY ║
║ • Aggregate Functions ║
║ • HAVING ║
║ • ORDER BY ║
╚══════════════════════════════════════════════════════════════════════╝
╔══════════════════════════════════════════════════════════════════════╗
║ LEVEL 2 — FILTERING & QUERY LOGIC ║
╠══════════════════════════════════════════════════════════════════════╣
║ WHERE ║
║ ├── Comparison ║
║ ├── AND / OR / NOT ║
║ ├── BETWEEN ║
║ ├── IN / NOT IN ║
║ ├── LIKE / NOT LIKE ║
║ ├── IS NULL / IS NOT NULL ║
║ └── EXISTS / NOT EXISTS / ANY / SOME / ALL ║
║ ║
║ Also: CASE • NULL handling • CAST • CONVERT ║
╚══════════════════════════════════════════════════════════════════════╝
╔══════════════════════════════════════════════════════════════════════╗
║ LEVEL 3 — ADVANCED QUERYING ║
╠══════════════════════════════════════════════════════════════════════╣
║ • SET OPERATORS ║
║ ├── UNION ║
║ ├── UNION ALL ║
║ ├── INTERSECT ║
║ └── EXCEPT ║
║ ║
║ • SUBQUERIES ║
║ • CTE ║
║ • WINDOW FUNCTIONS ║
║ • ROW_NUMBER / RANK / DENSE_RANK ║
║ • LAG / LEAD ║
║ • OVER / PARTITION BY ║
╚══════════════════════════════════════════════════════════════════════╝
╔══════════════════════════════════════════════════════════════════════╗
║ LEVEL 4 — SQL FUNCTIONS ║
╠══════════════════════════════════════════════════════════════════════╣
║ • String Functions ║
║ • Date & Time Functions ║
║ • Numeric Functions ║
║ • NULL Functions ║
║ • Conditional Functions ║
║ • Conversion Functions ║
╚══════════════════════════════════════════════════════════════════════╝
╔══════════════════════════════════════════════════════════════════════╗
║ LEVEL 5 — DATA MANIPULATION (DML) ║
╠══════════════════════════════════════════════════════════════════════╣
║ • INSERT ║
║ • UPDATE ║
║ • DELETE ║
║ • MERGE ║
║ • OUTPUT ║
╚══════════════════════════════════════════════════════════════════════╝
╔══════════════════════════════════════════════════════════════════════╗
║ LEVEL 6 — DATABASE STRUCTURE (DDL) ║
╠══════════════════════════════════════════════════════════════════════╣
║ • CREATE ║
║ • ALTER ║
║ • DROP ║
║ ║
║ Objects: ║
║ • Database ║
║ • Table ║
║ • View ║
║ • Index ║
║ • Procedure ║
║ • Function ║
║ • Trigger ║
╚══════════════════════════════════════════════════════════════════════╝
╔══════════════════════════════════════════════════════════════════════╗
║ LEVEL 7 — DATABASE DESIGN ║
╠══════════════════════════════════════════════════════════════════════╣
║ • Data Types ║
║ • Primary Key ║
║ • Foreign Key ║
║ • UNIQUE ║
║ • NOT NULL ║
║ • CHECK ║
║ • DEFAULT ║
║ • Normalization ║
║ • Relationships ║
╚══════════════════════════════════════════════════════════════════════╝
╔══════════════════════════════════════════════════════════════════════╗
║ LEVEL 8 — SQL SERVER PROGRAMMING ║
╠══════════════════════════════════════════════════════════════════════╣
║ • Variables ║
║ • IF / ELSE ║
║ • WHILE ║
║ • Stored Procedures ║
║ • User-Defined Functions ║
║ • Temporary Tables ║
║ • Table Variables ║
║ • Dynamic SQL ║
║ • Error Handling ║
╚══════════════════════════════════════════════════════════════════════╝
╔══════════════════════════════════════════════════════════════════════╗
║ LEVEL 9 — TRANSACTIONS & CONCURRENCY ║
╠══════════════════════════════════════════════════════════════════════╣
║ • BEGIN TRANSACTION ║
║ • COMMIT ║
║ • ROLLBACK ║
║ • SAVE TRANSACTION ║
║ • Isolation Levels ║
║ • Locking ║
║ • Blocking ║
║ • Deadlocks ║
╚══════════════════════════════════════════════════════════════════════╝
╔══════════════════════════════════════════════════════════════════════╗
║ LEVEL 10 — PERFORMANCE & ADVANCED SQL SERVER ║
╠══════════════════════════════════════════════════════════════════════╣
║ • Clustered / Nonclustered Indexes ║
║ • Composite Indexes ║
║ • Included Columns ║
║ • Filtered Indexes ║
║ • Index Fragmentation ║
║ • Execution Plans ║
║ • Query Optimization ║
║ • PIVOT / UNPIVOT ║
║ • CROSS APPLY / OUTER APPLY ║
║ • GROUPING SETS / ROLLUP / CUBE ║
║ • JSON / XML ║
║ • Temporal Tables ║
║ • Full-Text Search ║
║ • Sequences ║
╚══════════════════════════════════════════════════════════════════════╝
THE BIG PICTURE
┌───────────────────────┐
│ SQL SERVER │
└───────────┬───────────┘
│
┌──────────────────────────┼──────────────────────────┐
│ │ │
▼ ▼ ▼
┌─────────────────┐ ┌─────────────────┐ ┌─────────────────┐
│ QUERYING │ │ DATA CHANGES │ │ DATABASE DESIGN │
└────────┬────────┘ └────────┬────────┘ └────────┬────────┘
│ │ │
├── SELECT ├── INSERT ├── TABLE
├── FROM ├── UPDATE ├── CONSTRAINTS
├── JOIN ├── DELETE ├── DATA TYPES
├── WHERE └── MERGE └── RELATIONSHIPS
├── GROUP BY
├── HAVING
└── ORDER BY
│
▼
┌─────────────────────┐
│ ADVANCED QUERYING │
└──────────┬──────────┘
│
├── SUBQUERIES
├── CTE
├── WINDOW FUNCTIONS
├── SET OPERATORS
├── APPLY
└── PIVOT / UNPIVOT
│
▼
┌─────────────────────┐
│ SQL PROGRAMMING │
└──────────┬──────────┘
│
├── VARIABLES
├── IF / ELSE
├── WHILE
├── PROCEDURES
├── FUNCTIONS
├── TEMP TABLES
├── DYNAMIC SQL
└── ERROR HANDLING
│
▼
┌─────────────────────┐
│ TRANSACTIONS │
└──────────┬──────────┘
│
├── COMMIT
├── ROLLBACK
├── SAVEPOINT
├── LOCKING
├── BLOCKING
└── DEADLOCKS
│
▼
┌─────────────────────┐
│ PERFORMANCE │
└──────────┬──────────┘
│
├── INDEXES
├── EXECUTION PLANS
├── QUERY OPTIMIZATION
└── PERFORMANCE TUNING
MOST IMPORTANT LEARNING ORDER
01 → SELECT
02 → FROM
03 → JOIN
04 → WHERE
05 → GROUP BY
06 → Aggregate Functions
07 → HAVING
08 → ORDER BY
09 → CASE
10 → NULL Handling
11 → String Functions
12 → Date/Time Functions
13 → Subqueries
14 → UNION / INTERSECT / EXCEPT
15 → CTE
16 → Window Functions
17 → INSERT / UPDATE / DELETE
18 → Constraints
19 → Tables / Views
20 → Stored Procedures
21 → Functions
22 → Temporary Tables
23 → Transactions
24 → Error Handling
25 → Indexes
26 → Execution Plans
27 → Query Optimization
28 → Advanced SQL Server
No comments:
Post a Comment