SQL Server’da Bir T-SQL Meydan Okuması: En Çok Kazananları Bulmak

SQL Server’da Bir T-SQL Meydan Okuması: En Çok Kazananları Bulmak

Birkaç ay önce, birçok SQL Server Sorgusunun performansını yeniden yazarak iyileştirmemiz gereken Kapsamlı Veritabanı Performansı Healt Check yaptığımız  bir danışmanlık anlaşmasına katılmıştık. Bu blog yazısında, iki tabloyu (Çalışanlar ve Departmanlar) içeren ilgi çekici bir SQL zorluğunu keşfedeceğiz. Amaç, her departmanda en yüksek maaş alan (en çok kazanan) üç çalışanı ve bunlara karşılık gelen departman ayrıntılarını bulmaktır. Bu sorunu çözmek için, her biri karmaşık sorguları çözmeye yönelik benzersiz içgörüler sunan iki farklı T-SQL çözümünü inceleyeceğiz.

Durumu Hazırlamak

Çalışanlar ve Departmanlar tablolarının yapısını ve ilgili verilerini anlayarak başlayalım. Çalışanlar tablosu, Çalışan Kimliği, Adı, Soyadı, Departman Kimliği ve Maaş sütunlarını içerir. Departmanlar tablosu ise DepartmentID, DepartmentName ve Location sütunlarından oluşur.

CREATE TABLE Employees (

EmployeeID INT PRIMARY KEY,

FirstName VARCHAR(50),

LastName VARCHAR(50),

DepartmentID INT,

Salary DECIMAL(10, 2)

);

CREATE TABLE Departments (

DepartmentID INT PRIMARY KEY,

DepartmentName VARCHAR(50),

Location VARCHAR(50)

);

INSERT INTO Departments VALUES

(1, ‘HR’, ‘Londra’),

(2, ‘Engineering’, ‘Manchester’),

(3, ‘Finance’, ‘Plymouth’);

INSERT INTO Employees VALUES

(1, ‘Ethan’, ‘Anderson’, 1, 70000),

(2, ‘Olivia’, ‘Foster’, 1, 80000),

(3, ‘Benjamin’, ‘Clarke’, 1, 75000),

(4, ‘Ava’, ‘Mitchell’, 1, 80000),

(5, ‘William’, ‘Roberts’, 2, 90000),

(6, ‘Sophia’, ‘Edwards’, 2, 85000),

(7, ‘James’, ‘Bennett’, 2, 95000),

(8, ‘Isabella’, ‘Watson’, 2, 90000),

(9, ‘Alexander ‘, ‘Nelson’, 3, 100000),

(10, ‘Emily’, ‘Turner’, 3, 110000),

(11, ‘Jacob’, ‘Parker’, 3, 105000),

(12, ‘Mia’, ‘Carter’, 3, 100000);

Duruma Genel Bakış-En Çok Kazananlar

Buradaki zorluk, birden fazla çalışanın aynı maaşa sahip olma olasılığını göz önünde bulundurarak, her departmanda en yüksek maaş alan ilk üç çalışanı alan bir T-SQL sorgusu yazmaktır. Bir departmanda aynı en yüksek maaşa sahip üçten fazla çalışan varsa hepsinin sonuca dahil edilmesini sağlamak istiyoruz.

1.Çözüm: Ortak Tablo İfadelerini (CTE) Kullanma

Her bir çalışanın ilgili departman içindeki sıralamasını maaşlarına göre azalan düzende hesaplayan, Çalışan Derecesi adlı bir Ortak Tablo İfadesi (CTE) ile başlıyoruz. PARTITION BY yan tümcesi, çalışanları departmana göre gruplamamıza yardımcı olur ve ORDER BY yan tümcesi, onları azalan düzende maaşlarına göre düzenler. Daha sonra RANK() işlevini kullanarak her departmandan en çok maaş alan ilk üç çalışanı seçiyoruz.

;WITH EmployeeRank AS (

SELECT

e.EmployeeID,

e.FirstName,

e.LastName,

e.DepartmentID,

e.Salary,

d.DepartmentName,

d.Location,

DENSE_RANK() OVER (PARTITION BY e.DepartmentID ORDER BY e.Salary DESC) AS Rank

FROM Employees e

JOIN Departments d ON e.DepartmentID = d.DepartmentID

)

SELECT

EmployeeID,

FirstName,

LastName,

DepartmentID,

Salary,

DepartmentName,

Location

FROM EmployeeRank

WHERE Rank <= 4

ORDER BY DepartmentID, Salary DESC;

2. Çözüm: Alt Sorguları Kullanma

Bu yaklaşımda, istenen sonuca ulaşmak için alt sorgular kullanırız. Ana sorgu, Çalışanlar ve Departmanlar tabloları arasında, departman bilgileriyle birlikte çalışan ayrıntılarını aldığımız bir kendi kendine birleşmeyi içerir. WHERE yan tümcesindeki alt sorgu, aynı departmanda mevcut çalışandan daha yüksek maaşlı farklı çalışanların sayısını sayar. Bir departmanda aynı maaşa sahip tüm çalışanları dahil ettiğimizden emin olarak sayısı üçten az olan çalışanları seçiyoruz.

SELECT

e.EmployeeID,

e.FirstName,

e.LastName,

e.DepartmentID,

e.Salary,

d.DepartmentName,

d.Location

FROM Employees e

JOIN Departments d ON e.DepartmentID = d.DepartmentID

WHERE (

SELECT COUNT(DISTINCT e2.Salary)

FROM Employees e2

WHERE e2.DepartmentID = e.DepartmentID AND e2.Salary > e.Salary

) < 2

ORDER BY e.DepartmentID, e.Salary DESC;

Çözüm

T-SQL kullanarak her departmanda en çok kazananları bulma zorluğunu çözmek, düşünceli bir yaklaşım ve gelişmiş SQL tekniklerinin uygulanmasını gerektirir. İki farklı çözüm aracılığıyla, Ortak Tablo İfadelerinin (CTE’ler) ve alt sorguların bu görevi verimli bir şekilde gerçekleştirmek için nasıl kullanılabileceğini gösterdik. SQL uzmanları olarak, bu tür karmaşık sorguları anlamak ve bunlara hakim olmak, veritabanı işlemlerini optimize etmek ve verilerinizden değerli bilgiler elde etmek için çok önemlidir.

Not: SQL becerilerinizi daha da geliştirmek ve karmaşık zorlukların üstesinden gelmede T-SQL’in gücünü keşfetmek için sağlanan çözümleri, farklı senaryolar ve veri kümeleriyle denemekten çekinmeyin. Bu şekilde, pratik yaparak SQL yeteneklerinizi daha da ilerletebilir ve gerçek dünya problemlerine uyarlayabilirsiniz. Karmaşık sorgular, veri tabanı tasarımı ve optimizasyon gibi konuları ele alırken, farklı senaryolar ve veri kümeleri üzerinde çalışarak geniş bir perspektif elde edebilirsiniz. Bu da, gerçek hayatta karşılaşabileceğiniz daha karmaşık sorunları çözme becerinizi geliştirmenize yardımcı olacaktır. Unutmayın, pratik yapmak ve denemek, SQL becerilerinizi ilerletmenin önemli bir parçasıdır.

[vc_row full_width=”stretch_row” css=”.vc_custom_1505794887127{background-color: #2596be !important;}” gradient_animation=”#ffbc63,#d46b02″][vc_column][stm_cta button_color=”custom” button_custom_color=”#0077c2″ icon_custom_color=”#ffffff” button_icon_pos=”right” button_icon=”stmicon-chevron-right” style=”style_6″ link=”url:aryasoft.com.tr/contacts |title:İletişim”] Size ve Veritabanlarınıza Yardımcı Olmak İçin Bekliyoruz! [/stm_cta][/vc_column][/vc_row][vc_row css=”.vc_custom_1501845139892{margin-top: 50px !important;margin-bottom: 25px !important;}”][/vc_row]