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

Reklamlar

Marquee Etiketi İle Kayan Makale Listesi

Şu sıralar bir web projesiyle ilgilendiğim için web tarafındaki açığımı kapatmak adına sürekli arayış içerisindeyim. Mevcut projede kullanmak üzere kayan bir blok içerisinde haber ya da makalelerin yer alacağı bir bölüm yapma fikri aklıma geldi. Bunun nasıl yapıldığını bir web cahili olarak bilmediğim için hemen araştırmalara başladım 🙂 Ve ilaç gibi bir html etiketi buldum : marquee. Hem unutmamak hem de size faydalı olması açısından bu konuyu da derli toplu bir makale haline getirmeye karar verdim. Şimdi ufak bir uygulama yapıp marquee etiketinden yararlanarak neler yapabiliriz bir bakalım. Okumaya devam et Marquee Etiketi İle Kayan Makale Listesi

Asp.Net PopupMessageBox

Web projeleri yaparken hepimizin aklından şu masaüstü uygulamalarındaki MessageBox keşke web’de de olsa diye geçmiştir. Özellikle benim gibi web projelerinden ve javascript gibi bir can simidinden uzak olanlar. İşte yine böyle düşündüğüm bir gün Burak Hoca’nın paylaştığı A Customize MessageBox, ConfirmBox and FrameBox Control for ASP.NET adlı makaleyi görünce işte aradığım işey dedim. Ancak makaledeki kodları uygularken Ajax Control Toolkit versiyonu yüzünden hata aldım (Makalede kullanılan versiyon 3.0, ben projede 3.5 kullanıyorum.) ve iş başa düştü diyerek bir User Control yazmaya başladım. Okumaya devam et Asp.Net PopupMessageBox

ASP.net Nitelik(Attribute) Bazlı Veri Doğrulama(Validation)

Önceki çalıştığım işyerinde proje bir web projesiydi. Ama ben web kısmından çok veri erişim ve modelleme tarafındaydım. Proje yöneticimiz kullandığımız nesnelerin özelliklerinin (property) kısıtlarının (zorunlu alan, karakter uzunluğu vs.) kod tarafında verilerek bunların web sayfalarına taşınmasını istedi. Aslında bu noktada daha önceden standart kullandığımız Asp.net validasyon kontrolleri var. Ama ekrana atılan her kontrole karşılık hata mesajı değerini oluşturmalı ve bir özellik için birden fazla kontrol yapmak istediğimizde ekrana birden fazla validation kontrolü kullanmak durumundayız. Küçük bir proje yapıyorsak bu işimizi görebilir. Ancak daha büyük projelerde daha profesyonel bir yöntem bulmak daha iyi olacaktır diye düşünüyorum. (En azından proje yöneticim bu bakış açısını bana kazandırdıktan sonra :))

Bu amaçla; veri erişim katmanında veri doğrulama yapabilmek için Asp.net MVC Framework ile birlikte gelen ve System. ComponentModel.DataAnntations dll’ i içerisinde yer alan validasyon niteliklerini (validation attributes) kullanıyoruz.  Okumaya devam et ASP.net Nitelik(Attribute) Bazlı Veri Doğrulama(Validation)

Entity Framework POCO Nesneleri İle Stored Procedure Kullanımı

POCO(Plain Old CLR Objects) Nedir? yazısında POCO hakkında kısa bir giriş yapmıştık, şimdi biraz daha ileleyeceğiz ve POCO’da Stored Procedure kullanımını ele alacağız.

Oluşturduğumuz Context’imizde Stored Procedure eklemek için öncelikle Modelimize sağ tıklayıp Update From Database diyoruz ve Stored Procedure sekmesinden istediğimiz sp’yi seçiyoruz. Model Browser’ı açtığımızda AdventureWorksModel.Store’un altında Stored Procedure klasörünün altında ilgili sp’nin geldiğini görürüz. Ama işimiz burada bitmiyor, sp’mizi seçip sağ tıklıyoruz ve Add Import Function diyoruz. Burada çıkan ekranda sp’mizin dönüş tipini seçiyoruz. Ben tüm kategorileri getiren bir sp yazdım ve bu nedenle dönüş tipini belirtmek için Entities seçeneğini seçip ProductCategory sınıfını seçiyoruz. Artık sp’miz Context’imize dahil edildi. EF’nin oluşturduğu nesneleri kullanıyor olsaydık Context nesnemiz üzerinden sp’mize ulaşabilirdik ancak POCO nesnelerini kullandığımız için sp’mizi çalıştıracak olan metodu Context sınıfımızda yazmamız gerekiyor. Okumaya devam et Entity Framework POCO Nesneleri İle Stored Procedure Kullanımı