Etiket arşivi: sql

SQL While Döngüsünün Kullanımı

query while

Sql de döngülere pek ihtiyaç olmaz fakat bazen çok kullanışlı olabiliyor,

Örnek olarak sıfırdan n sayısına kadar olan rakamların toplamını veren bir döngü yapalım, bunun için üç tane değişken oluşturalım;

1) n sayısı

2) döngünün kaçıncı döngü olduğu bilgisini tutan değişken

3) toplam bilgisinin tutulacağı değişken


/* n sayımız */

declare @nsayisi as int

/* döngü sayısını sayacağımız değişken */

declare @say as int

/* toplam alacağımız değişken */

declare @sonuc as int

Algoritmayı koda dökelim,

@say değişkeni, @nsayisi değişkeninin değerinden küçük olduğu sürece döngü oluştur,

her döngüde @say değişkeninin değerini 1 arttır

her döngüde @sonuc değişkenini kendisi ve @say değişkeninin toplamına eşitle

döngü bitince @sonuç değerini ekrana yazdır.


declare @nsayisi as int = 3
declare @say as int = 0
declare @sonuc as int = 0

while @say < @nsayisi
begin
set @say = @say + 1
set @sonuc = @sonuc + @say
end

print @sonuc

dongu while

MSSQL Rollup ve Cube ile satır şeklinde toplam

Mssql Rollup ve Cube ile Nasıl Toplam Alınır?

Yazdığınız programda satır toplamı alma işini direk olarak veritabanında yapmak isteyebilirsiniz.

Bu işlemi yapabilmek için rollup veya cube komutlarını kullanmanız gerekir.

Aşağıda bunların kullanımını örnekledim;

 

deneme_not1 isminde şöyle bir tablomuz olsun
rollup

Örnek olarak şu kayıtları girelim

rollup

rollup ve cube için bir kaç deneme yapıp sonucunu görelim

rollup

rollup

rollup

Görüldüğü üzere rollup ile aldığımız sorgu, group by alanında belirttiğimiz sütunlara göre toplam oluşturuyor, cube ile aldığımız sorgu ise farklı sütun kombinasyonları için tek tek toplamlar oluşturuyor.

Son olarak da mantığı daha net görebilmek için basit bir örnek yapalım

rollup ve cube toplam

Sorguda dikkatinizi çekmesi gereken bir nokta da isnull() fonksiyonu, cube ve rollup toplamlara bağlı sütun değerini null olarak döndürdüğü için eğer nullsa Toplam yaz mantığıyla bu fonksiyonu kullanabiliyoruz.

C# dd.mm.yyyy formatındaki tarihi yyyy-mm-dd formatına çevirme

c sharp tarih

Tarih formatı sorunu çözümü

Program içerisindeki tarih formatı veritabanına uymayabilir

Bu sorunu çözmek için internette bulamayınca kendi yazdığım bir fonksiyon


public static string tarihdonustur(string tarih)
{
tarih = tarih.ToString().Split('.')[2] + "-" + tarih.ToString().Split('.')[1] + "-" + tarih.ToString().Split('.')[0];
return tarih.ToString();
}

Mssql Sınırsız Kategori Yapımı

sınırsız kategori sql

Sql ile sınırsız kategori nasıl yapılır?

Geliştirdiğim bir erp projesi için sınırsız kategori özelliği lazım olmuştu, bu işi çözmenin en mantıklı yolunun sql olacağına karar verdim ve yazdım.

Kategori listesinin olduğu bir tablomuz olduğunu düşünelim. Sütun olarak kategoriid, kategoriismi ve bir de ustkategori isimli 3 adet sütunumuz olsun.
kategoriid: primary key olarak her kategorinin kendine özgü değer alacağı sütundur, int tipinde olacaktır.
kategoriismi: kategorinin ismini belirten sütundur, nvarchar tipinde olacaktır.
ustkategori: kategorinin herhangi bir kategorinin altı olduğu durumunda hangi kategorinin alt kategorisi olduğunu bu sütundan anlayacağız, eğer kategori alt kategori değilse bu sütun 0 değerini alacaktır, eğer bir alt kategoriyse alt kategorisi olduğu kategorinin id numarasını alacaktır.

tedarik2

Yukarıdaki örneğin uygulamasını içeren kod aşağıdadır.


with KTG as
(

select kategoriid, CAST(kategoriismi as varchar(255)) as kategoriismi, ustkategori
from tedarik_kategoriler
where ustkategori = 0

union all

select c.kategoriid, CAST(p.kategoriismi + ' -> ' + c.kategoriismi as varchar(255)), c.ustkategori
from tedarik_kategoriler as c
join KTG as p on p.kategoriid = c.ustkategori
)

select * from KTG
order by kategoriismi

Sorgunun çıktısı aşağıdaki gibi olacaktır:
kategorilerSınırsız kategori yapımını elimden geldiği kadarıyla anlatmaya çalıştım, yapamadığınız veya anlamadığınız yer olursa her zaman sorabilirsiniz

Mssql join kullanımı

sql join

Sql join kullanımı nasıldır?

sql ile join işlemleri gerçekleştirebilmek için aşağıdaki örneği uygulayın.

Elimizde üç adet tablo olsun ve tablolar aşağıdaki gibi olsun

Tablo1: personel
Sütunları: personelid, adsoyad

Tablo2: departman
Sütunları: departmanid, departmantanimi

Tablo3: departmanindex
Sütunları: departmanindexid, departmanid, personelid

Yaptığımız her personel kaydı için ait olduğu departman bilgisini de çekeceğiz, ama bu departman bilgisini kayıt tekrarını önlemek için departman id si ile kaydedeceğiz, yani departman isimleri değil departmanların id numaraları tekrar edecek, bu sayede veritabanı hem daha organize bir şekilde oluşacak hem de kayıt tekrarı yüzünden şişmeyecek

Insert işlemini daha önce yaptığımızı düşünerek buna uygun select işlemi örneği aşağıdaki gibidir.


select

personel.adsoyad,
departman.departmantanimi

from personel

inner join departmanindex on departmanindex.departmanid = departman.departmanid
left outer join departmanindex on departmanindex.personelid = personel.personelid

Bu şekilde veritabanından personel ad ve soyadı birinci sütunda, bağlı olduğu departman ikinci sütunda olacak şekilde bir kayıt döndürebiliriz.

İlk joinde departman isimlerini inner join ile departmanindex tablosuna bağladık.

İkinci joinde left outer join yerine inner join kullanmış olsaydık sadece departman bilgisi olan personeller karşımıza çıkacaktı, right outer join veya full join kullanmış olsaydık herhangi bir personele bağlı olmayan departmanlar da personel adı ve soyadınının bulunduğu sütun null fakat departman bilgisinin bulunduğu sütunda bilgi var olacak şekilde kayıt dönecekti.

Diğer tüm kodlama yöntemlerinde olduğu gibi bu yöntemi de en iyi öğrenme yolu verilen örneği uygulamaktır, aklınıza takılan bir soru olursa çekinmeden sorabilirsiniz.