حذف مقادیر تکراری در SQL Server با SELECT DISTINCT

حذف مقادیر تکراری در SQL Server: راهنمای جامع SELECT DISTINCT

دستور SELECT DISTINCT در SQL Server برای بازیابی مقادیر منحصر به فرد (Unique) از یک یا چند ستون استفاده می‌شود. این دستور به شما کمک می‌کند تا ردیف‌های تکراری را از نتیجه کوئری خود حذف کنید و فقط اولین وقوع هر ترکیب منحصر به فرد از ستون‌های مشخص شده را نمایش دهید. اگر کلمه DISTINCT را پس از SELECT مشخص نکنید، تمام ردیف‌های بازیابی شده (شامل موارد تکراری) نمایش داده می‌شوند.

برای شروع، یک جدول نمونه به نام ProductSales ایجاد می‌کنیم و چند رکورد برای مثال‌ها در آن درج می‌کنیم:


CREATE TABLE ProductSales (
    ProductID INT,
    ProductName VARCHAR(50),
    SalesAmount DECIMAL(10, 2),
    SalesDate DATE
);

INSERT INTO ProductSales (ProductID, ProductName, SalesAmount, SalesDate) VALUES
(1, 'Laptop', 1200.00, '2023-01-01'),
(2, 'Mouse', 25.00, '2023-01-01'),
(1, 'Laptop', 1200.00, '2023-01-02'),
(3, 'Keyboard', 75.00, '2023-01-02'),
(2, 'Mouse', 30.00, '2023-01-03'),
(4, 'Monitor', 300.00, '2023-01-03'),
(1, 'Laptop', 1250.00, '2023-01-04'),
(3, 'Keyboard', 75.00, '2023-01-04'),
(5, 'Webcam', 50.00, '2023-01-05'),
(4, 'Monitor', 320.00, '2023-01-05');

بازیابی مقادیر DISTINCT از یک ستون

برای مشاهده تمام مقادیر منحصر به فرد ProductName از جدول ProductSales، می‌توانید از کوئری زیر استفاده کنید. این دستور فقط نام محصولات بدون تکرار را به شما نشان می‌دهد:


SELECT DISTINCT ProductName
FROM ProductSales;

اگر کلمه DISTINCT را حذف کنید، تمام نام محصولات، از جمله موارد تکراری، نمایش داده می‌شوند:


SELECT ProductName
FROM ProductSales;

استفاده از SELECT DISTINCT با چندین ستون

هنگامی که DISTINCT را با چندین ستون استفاده می‌کنید، ترکیب منحصر به فرد تمام ستون‌های مشخص شده در نظر گرفته می‌شود. به عنوان مثال، برای مشاهده ترکیب‌های منحصر به فرد ProductName و SalesAmount، از دستور زیر استفاده کنید:


SELECT DISTINCT ProductName, SalesAmount
FROM ProductSales;

در این حالت، اگر ProductName یکسان باشد اما SalesAmount متفاوت باشد، هر دو ردیف به عنوان منحصر به فرد در نظر گرفته می‌شوند. تنها در صورتی یک ردیف حذف می‌شود که ترکیب دقیقاً یکسانی از ProductName و SalesAmount وجود داشته باشد.

SELECT DISTINCT با توابع تجمعی (Aggregate Functions)

SELECT DISTINCT را می‌توان با توابع تجمعی مانند COUNT برای شمارش مقادیر منحصر به فرد استفاده کرد. به عنوان مثال، برای شمارش تعداد محصولات منحصر به فرد:


SELECT COUNT(DISTINCT ProductName) AS UniqueProductsCount
FROM ProductSales;

در این کوئری، تابع COUNT تنها مقادیر منحصر به فرد ستون ProductName را شمارش می‌کند و نتیجه را در ستون UniqueProductsCount نمایش می‌دهد.

همچنین می‌توانید این کار را برای شمارش تعداد فروش‌های منحصر به فرد (بر اساس SalesAmount) انجام دهید:


SELECT COUNT(DISTINCT SalesAmount) AS UniqueSalesAmountsCount
FROM ProductSales;

تفاوت SELECT DISTINCT و GROUP BY

SELECT DISTINCT و GROUP BY هر دو می‌توانند برای حذف ردیف‌های تکراری استفاده شوند، اما اهداف متفاوتی دارند. DISTINCT صرفاً برای بازیابی مقادیر منحصر به فرد طراحی شده است، در حالی که GROUP BY برای گروه‌بندی ردیف‌ها با مقادیر یکسان در یک یا چند ستون و سپس اعمال توابع تجمعی بر روی هر گروه استفاده می‌شود.

نتیجه کوئری زیر با DISTINCT همانند GROUP BY خواهد بود اگر فقط ستون‌ها را انتخاب کنید:


SELECT ProductName
FROM ProductSales
GROUP BY ProductName;

با این حال، تفاوت اصلی زمانی مشخص می‌شود که شما نیاز به انجام محاسبات تجمعی بر روی گروه‌ها داشته باشید. به عنوان مثال، برای نمایش ProductName منحصر به فرد و مجموع SalesAmount برای هر محصول، باید از GROUP BY استفاده کنید، نه DISTINCT:


SELECT ProductName, SUM(SalesAmount) AS TotalSales
FROM ProductSales
GROUP BY ProductName;

در این حالت، SELECT DISTINCT نمی‌تواند مجموع فروش (SUM(SalesAmount)) را برای هر گروه ارائه دهد.

SELECT DISTINCT با مقادیر NULL

هنگام استفاده از SELECT DISTINCT، مقادیر NULL نیز به عنوان مقادیر منحصر به فرد در نظر گرفته می‌شوند. اگر چندین NULL در یک ستون وجود داشته باشد، DISTINCT تنها یک ردیف NULL را برمی‌گرداند. این رفتار در SQL استاندارد است.

یک رکورد با مقدار NULL در ProductName اضافه می‌کنیم تا این موضوع را نشان دهیم:


INSERT INTO ProductSales (ProductID, ProductName, SalesAmount, SalesDate) VALUES
(6, NULL, 10.00, '2023-01-06'),
(7, NULL, 15.00, '2023-01-07');

حالا، ProductName های منحصر به فرد را بازیابی می‌کنیم:


SELECT DISTINCT ProductName
FROM ProductSales;

در نتیجه این کوئری، تنها یک NULL در خروجی مشاهده خواهید کرد، در کنار سایر نام‌های محصول منحصر به فرد.

استفاده از SELECT DISTINCT با ORDER BY

می‌توانید از ORDER BY برای مرتب‌سازی نتایج SELECT DISTINCT استفاده کنید. برای مثال، برای مشاهده نام محصولات منحصر به فرد به ترتیب حروف الفبا:


SELECT DISTINCT ProductName
FROM ProductSales
ORDER BY ProductName;

اگر با چندین ستون DISTINCT استفاده می‌کنید و می‌خواهید نتایج را بر اساس یکی از آن ستون‌ها مرتب کنید، باید آن ستون در لیست SELECT DISTINCT نیز باشد:


SELECT DISTINCT ProductName, SalesAmount
FROM ProductSales
ORDER BY ProductName ASC, SalesAmount DESC;
Distinct
Comments (0)
Add Comment