T-SQL Over Kullanımı

Bu yazımızda T-Sql’de Over şartının kullanımını bir örnek üzerinden inceleyeceğiz.  Örnek senaryomuz için öncelikte Sql Server’ da  aşağıdaki gibi bir Order tablosu oluşturalım.

Order tablosuna aşağıdaki gibi rastgele kayıtlar girelim.

Şimdi düşünün ki şöyle bir ihtiyacımız olsun her bir siparişin, toplam yapılan sipariş miktarının % kaçı olduğunu hesaplayalım.

select OrderId,Amount,(Amount/SUM(Amountover())*100 as YuzdeOran from [Order]


SUM
(Amount)over()İle  herhangi bir gruplama işlemi yapmadan tüm kayıtların toplamını her satırda alabiliriz. Neden bu şekilde bir kullanıma gittiğimizi daha iyi anlamak için isterseniz sorguyu bir de aşağıdaki gibi çalıştıralım.

select OrderId,Amount,(Amount/SUM(Amount))*100 as YuzdeOran from [Order]

Bu durumda aşağıdaki gibi bir hata alırız.

Msg 8120, Level 16,
State 1, Line 1

Column ‘Order.OrderId’ is invalid in
the select list because it is not contained in either an aggregate function or
the GROUP BY clause.

OrderId bir Aggregate fonksiyon ile kullanılmadığı ya da gruplama yapılmadığı için yukarıdaki hatayı aldık. Aynı hata Amount kolonu için de geçerli olacaktır. Burada gruplama yapmak doğru bir yöntem olmaz çünkü Select ettiğimiz alanlardan biri Uniquie olmayan bir değere sahip olabilir bu nedenle gruplama yaptığımızda yanlış sonuç elde edebiliriz.
Şimdi de her bir siparişin, çalışanın yaptığı toplam sipariş miktarının % kaçı olduğunu hesaplayalım. Bunu Over şartının parantezinin içinde Partition by şartını kullanarak çalışan id değeri ile sağlıyoruz.

select OrderId,EmployeeId,Amount,(Amount/SUM(Amount) over(partition by EmployeeId))*100 as YuzdeOran
from [Order]

Böylelikle bu yazımızın sonuna geldik. Umarım faydalı olmuştur.
Bol yazılımlı günler 🙂

Kaynak:Microsoft® SQL Server® 2008 T-SQL Fundamentals by Itzik Ben-Gan