چگونگی ماکزیمم مقدار از چندین ستون در جدول SQL Server بیابیم؟
در SQL Server میتوان با روشی مانند MAX، CASE، CROSS APPLY و GREATEST بیشترین مقدار را از میان چندین ستون یک جدول استخراج کرد
چگونگی ماکزیمم مقدار از چندین ستون در جدول SQL Server بیابیم؟
در بسیاری از پروژههای پایگاه داده، اطلاعات مرتبط در چندین ستون مختلف ذخیره میشوند و گاهی لازم است بزرگترین مقدار (Maximum Value) را از میان این ستونها استخراج کنیم.
به عنوان مثال ممکن است یک جدول فروش شامل مقادیر فروش در فصلهای مختلف سال باشد یا جدولی داشته باشیم که نمرات چند آزمون یک دانشجو را در ستونهای جداگانه ذخیره کرده باشد.
در چنین شرایطی نیاز داریم بیشترین مقدار موجود بین چند ستون را به دست آوریم.
در SQL Server روشهای مختلفی برای پیدا کردن ماکزیمم مقدار از چندین ستون وجود دارد.
انتخاب روش مناسب به نسخه SQL Server، حجم دادهها و نوع خروجی مورد نیاز بستگی دارد.
آشنایی با تابع MAX در SQL Server
تابع ()MAX یکی از توابع تجمعی (Aggregate Functions) در SQL Server است.
مثال:
SELECT MAX(Salary)
FROM Employees
این دستور بزرگترین مقدار موجود در ستون Salary را برمیگرداند.
اما نکته مهم این است که تابع MAX به صورت مستقیم برای مقایسه چند ستون در یک رکورد طراحی نشده است.
فرض کنید جدول زیر را داریم:
| EmployeeID | Salary1 | Salary2 | Salary3 |
| 1 | 5000 | 7000 | 6000 |
| 2 | 8000 | 4000 | 9000 |
| 3 | 3000 | 4500 | 3500 |
اگر بخواهیم بیشترین مقدار هر ردیف را پیدا کنیم، نمیتوانیم به سادگی از MAX استفاده کنیم.
🌟 آیا میخواهید به یک متخصص پایگاه داده تبدیل شوید و در دنیای فناوری اطلاعات بدرخشید؟با دوره آموزشی SQL Server ما، شما میتوانید به راحتی و با روشی عملی، تمام مهارتهای لازم را یاد بگیرید!
این دوره به شما آموزش میدهد که چگونه دادهها را به بهترین شکل مدیریت کنید، گزارشهای قدرتمند بسازید و به تحلیلهای عمیق دست یابید.
با محتوای جذاب و پروژههای واقعی، شما نه تنها تئوری را یاد میگیرید، بلکه تواناییهای عملی خود را نیز تقویت میکنید.
پس فرصت را از دست ندهید! همین امروز به جمع یادگیرندگان ما بپیوندید و اولین قدم را به سوی آینده شغلی روشنتر بردارید!
⇐همین حالا شروع کنید و به دنیای دادهها بپیوندید!
روش اول: استفاده از CASE در SQL
یکی از روشهای قدیمی و متداول استفاده از CASE است.
SELECT
EmployeeID,
CASE
WHEN Salary1 >= Salary2
AND Salary1 >= Salary3
THEN Salary1
WHEN Salary2 >= Salary1
AND Salary2 >= Salary3
THEN Salary2
ELSE Salary3
END AS MaxSalary
FROM Employees
خروجی:
| EmployeeID | MaxSalary |
| 1 | 7000 |
| 2 | 9000 |
| 3 | 4500 |
مزایای روش CASE در SQL
-
سازگار با تمامی نسخههای SQL Server
-
بدون نیاز به توابع اضافی
-
عملکرد مناسب در جداول کوچک
معایب روش CASE
-
با افزایش تعداد ستونها پیچیده میشود.
-
نگهداری کد دشوارتر خواهد شد.

روش دوم: استفاده از VALUES و MAX در SQL
یکی از بهترین روشها در SQL Server استفاده از VALUES به همراه MAX است.
فرض کنید جدول زیر را داریم:
CREATE TABLE EmployeeSales
(
EmployeeID INT,
SaleJan INT,
SaleFeb INT,
SaleMar INT
)
نمونه داده:
INSERT INTO EmployeeSales
VALUES
(1,1000,1500,1200),
(2,2500,1800,2700),
(3,900,1100,800)
حال میخواهیم بیشترین فروش هر کارمند را پیدا کنیم.
SELECT
EmployeeID,
(
SELECT MAX(Value)
FROM
(
VALUES
(SaleJan),
(SaleFeb),
(SaleMar)
) AS Sales(Value)
) AS MaxSale
FROM EmployeeSales
خروجی:
| EmployeeID | MaxSale |
| 1 | 1500 |
| 2 | 2700 |
| 3 | 1100 |
نحوه عملکرد
در این روش:
VALUES
(SaleJan),
(SaleFeb),
(SaleMar)
سه ستون را به صورت موقت به سه سطر تبدیل میکنیم.
سپس تابع MAX روی آنها اجرا میشود.
مزایای استفاده از VALUES و MAX
-
خوانایی بالا
-
توسعه آسان
-
مناسب برای تعداد ستونهای زیاد
-
عملکرد بسیار خوب

روش سوم: استفاده از CROSS APPLY در SQL
یکی از حرفهایترین روشها استفاده از CROSS APPLY است.
SELECT
E.EmployeeID,
M.MaxSale
FROM EmployeeSales E
CROSS APPLY
(
SELECT MAX(V)
AS MaxSale
FROM
(
VALUES
(SaleJan),
(SaleFeb),
(SaleMar)
) X(V)
) M
خروجی:
| EmployeeID | MaxSale |
| 1 | 1500 |
| 2 | 2700 |
| 3 | 1100 |
مزیت CROSS APPLY
زمانی که بخواهیم چندین محاسبه را روی ستونها انجام دهیم بسیار کاربردی است.
مثلاً:
SELECT
EmployeeID,
M.MaxSale,
M.MinSale
FROM EmployeeSales
CROSS APPLY
(
SELECT
MAX(V) AS MaxSale,
MIN(V) AS MinSale
FROM
(
VALUES
(SaleJan),
(SaleFeb),
(SaleMar)
) X(V)
) M
روش چهارم: استفاده از UNPIVOT در SQL
فرض کنید تعداد ستونها زیاد باشد.
SELECT *
FROM EmployeeSales
UNPIVOT
(
SaleAmount
FOR MonthName
IN
(
SaleJan,
SaleFeb,
SaleMar
)
) U
خروجی:
| EmployeeID | SaleAmount | MonthName |
| 1 | 1000 | SaleJan |
| 2 | 1500 | SaleFeb |
| 3 | 1200 | SaleMar |
حال میتوانیم MAX را اعمال کنیم.
SELECT
EmployeeID,
MAX(SaleAmount)
FROM
(
SELECT *
FROM EmployeeSales
UNPIVOT
(
SaleAmount
FOR MonthName
IN
(
SaleJan,
SaleFeb,
SaleMar
)
) U
) T
GROUP BY EmployeeID
مثال عملی: بیشترین نمره دانشجو
فرض کنید جدول زیر را داریم:
CREATE TABLE StudentScores
(
StudentID INT,
Exam1 INT,
Exam2 INT,
Exam3 INT,
Exam4 INT
)
دادهها:
INSERT INTO StudentScores
VALUES
(1,15,17,19,18),
(2,20,18,16,19),
(3,14,13,15,17)
پیدا کردن بیشترین نمره:
SELECT
StudentID,
(
SELECT MAX(Score)
FROM
(
VALUES
(Exam1),
(Exam2),
(Exam3),
(Exam4)
) X(Score)
) AS MaxScore
FROM StudentScores
خروجی:
| StudentID | MaxScore |
| 1 | 19 |
| 2 | 20 |
| 3 | 17 |
مثال عملی: بیشترین فروش فصلی
جدول:
CREATE TABLE SalesReport
(
ProductID INT,
SpringSale DECIMAL(18,2),
SummerSale DECIMAL(18,2),
AutumnSale DECIMAL(18,2),
WinterSale DECIMAL(18,2)
)
کوئری:
SELECT
ProductID,
(
SELECT MAX(SaleValue)
FROM
(
VALUES
(SpringSale),
(SummerSale),
(AutumnSale),
(WinterSale)
) X(SaleValue)
) AS BestSeasonSale
FROM SalesReport
مدیریت NULL ها
گاهی برخی ستونها دارای مقدار NULL هستند.
مثال:
| SaleMar | SaleFeb | SaleJan |
| 1000 | 1200 | NULL |
در این حالت:
SELECT
(
SELECT MAX(Value)
FROM
(
VALUES
(SaleJan),
(SaleFeb),
(SaleMar)
) X(Value)
)
تابع MAX به طور پیشفرض مقادیر NULL را نادیده میگیرد.
استفاده از ISNULL
در صورت نیاز:
VALUES
(ISNULL(SaleJan,0)),
(ISNULL(SaleFeb,0)),
(ISNULL(SaleMar,0))
استفاده از GREATEST در SQL Server 2022
از SQL Server 2022 به بعد تابع جدیدی معرفی شده است:
SELECT
GREATEST
(
SaleJan,
SaleFeb,
SaleMar
)
AS MaxSale
FROM EmployeeSales
این تابع دقیقاً برای پیدا کردن بزرگترین مقدار میان چند عبارت طراحی شده است.
مثال
SELECT
EmployeeID,
GREATEST
(
Salary1,
Salary2,
Salary3
)
AS HighestSalary
FROM Employees
خروجی:
EmployeeID HighestSalary
1 7000
2 9000
3 4500
مزایای GREATEST در SQL
-
بسیار ساده
-
خوانایی بالا
-
سرعت مناسب
-
مناسب برای چندین ستون
-
محدودیت
فقط در SQL Server 2022 و نسخههای جدیدتر پشتیبانی میشود.
مقایسه روشها
| روش | خوانایی | سرعت | نسخه SQL Server |
| CASE | متوسط | خوب | همه نسخهها |
| VALUES + MAX | بسیار خوب | بسیار خوب | SQL Server 2008+ |
| CROSS APPLY | عالی | بسیار خوب | SQL Server 2008+ |
| UNPIVOT | خوب | متوسط | همه نسخهها |
| GREATEST | عالی | عالی | SQL Server 2022+ |
بهترین روش کدام است؟
اگر از SQL Server 2022 استفاده میکنید:
GREATEST()
بهترین و سادهترین انتخاب است.
اگر از نسخههای قدیمیتر استفاده میکنید:
VALUES + MAX
یا
CROSS APPLY + VALUES
بهترین گزینهها محسوب میشوند زیرا هم خوانایی بالایی دارند و هم نگهداری آنها آسان است.
جمعبندی
برای پیدا کردن ماکزیمم مقدار از چندین ستون در SQL Server روشهای مختلفی وجود دارد.
در نسخههای جدید SQL Server میتوان به سادگی از تابع GREATEST() استفاده کرد، اما در نسخههای قدیمیتر معمولاً روش VALUES + MAX یا CROSS APPLY بهترین انتخاب است.
این روشها امکان مقایسه چندین ستون را فراهم میکنند و برای سناریوهایی مانند محاسبه بیشترین فروش، بالاترین نمره، بیشترین حقوق یا بیشترین مقدار ثبتشده در چند ستون بسیار کاربردی هستند.
انتخاب روش مناسب باعث افزایش خوانایی کد، بهبود نگهداری و عملکرد بهتر کوئریها خواهد شد.

کاربران ما
شما هم نظرتون با ما دریاره “چگونگی ماکزیمم مقدار از چندین ستون در جدول SQL Server بیابیم؟” اشتراک بزارید
برای ارسال نظر لطفا ورود یا ثبت نام کنید