SQL'de Yuvarlama ve Matematiksel Hesaplama: ROUND, CEILING, FLOOR
Beceri rehberi

SQL'de Yuvarlama ve Matematiksel Hesaplama: ROUND, CEILING, FLOOR

Hazırlayan: Mindset Institute EditörlüğüGüncellendi: 5 dk okuma

SQL'de iki tam sayıyı böldüğünüzde ondalık kısım sessizce kesilebilir. Bu tuzağı, ROUND, CEILING ve FLOOR fonksiyonlarını ve yuvarlamanın sonuçları nasıl etkilediğini küçük bir hesapla adım adım görürsünüz.

Bir bakışta

  1. İki tam sayının bölümü, SQL Server'da tam sayı çıkar ve ondalık kısım atılır. Ondalıklı sonuç için bölünenlerden biri ondalık tipe çevrilir ya da ondalıkla çarpılır.
  2. MySQL'de bölme işleci ondalık sonuç verir, tam sayı bölmesi için DIV vardır. Aynı ifade, kullandığınız sisteme göre farklı sonuç üretebilir.
  3. ROUND en yakın değere yuvarlar, CEILING yukarı, FLOOR aşağı. Kaç koli, kaç sayfa gibi tam sayı gereken yerde CEILING doğru araçtır.
  4. Yuvarlamayı hesabın sonunda yapın. Ara sonuçları yuvarlayıp toplamak, toplamı yuvarlamaktan farklı sonuç verebilir.
  5. Para ve kesin oran hesabında DECIMAL kullanın. Kayan noktalı tipler yuvarlamada ve eşitlikte beklenmedik sonuç verebilir.

Tam sayı bölmesi: sessizce kesilen sonuç

SQL'de sık yapılan hata, tam sayı kolonlarının bölümünden ondalıklı sonuç beklemektir. SQL Server belgesine göre tam sayı bir bölünen, tam sayı bir bölene bölünürse sonuç da tam sayıdır ve ondalık kısım atılır. Yani toplam ve adet kolonları tam sayı ise şu sorgu beklediğiniz ortalamayı vermez:

SELECT toplam / adet AS ortalama FROM satis_ozeti;

Bölüm tam çıkmıyorsa sonuç kesirli kısmı atılmış bir tam sayı olarak gelir, beklediğiniz ondalık değer olarak değil. Hata fark edilmez çünkü sistem uyarı vermez; rapor yanlış sayıyla çalışmaya devam eder. Çözüm, bölünenlerden birini ondalık tipe çevirmektir:

SELECT toplam * 1.0 / adet AS ortalama FROM satis_ozeti;

SELECT CAST(toplam AS DECIMAL(12, 4)) / adet AS ortalama FROM satis_ozeti;

İlk yazım ondalık bir sabitle çarpıp sonucu ondalığa çevirir, ikincisi tipi açıkça belirtir; ikincisi niyeti daha net gösterir ve basamak sayısını kontrol etmenizi sağlar. Aynı sorunun MySQL'deki hâli farklıdır: MySQL'de bölme işleci ondalık sonuç verir ve tam sayı bölmesi için ayrı bir DIV işleci kullanılır. Sonucu kesmek istiyorsanız DIV, ondalık istiyorsanız normal bölme yazarsınız. PostgreSQL'de iki tam sayı bölümü, SQL Server gibi tam sayı döndürür.

Güvenli alışkanlık: bölme yapan her sorguda bölünenin tipini bilin. Örnek sonuçları elle hesaplayıp sorgunun çıktısıyla karşılaştırın.

Şekil 1

Aynı bölme, tipine göre farklı sonuç verir

Toplam ve adet kolonlarıyla örnek

ortalama = toplam / adet
Toplam ve adet10 ve 3
Tam sayı bölmesi: 10 / 33
Ondalıklı bölme: 10.0 / 3 (kısaltılmış)3.3333…
Yuvarlama: ROUND(10.0 / 3, 2)3.33
Doğru ortalama, ondalık bölmeyle3.33
Kaynak: Kurgusal örnek; gösterilen ondalık basamak sayısı sisteme ve tipe göre değişir. Kaynak: Microsoft Learn, Division ve ROUND (Transact-SQL)Mindset Institute

ROUND: en yakın değere yuvarlamak

ROUND fonksiyonu bir sayıyı belirtilen basamağa yuvarlar. SQL Server'da söz dizimi ROUND(sayı, basamak) biçimindedir. Basamak pozitifse ondalık sonrası basamak sayısını, negatifse virgülün soluna doğru yuvarlamayı belirtir; yani negatif değer onlara ya da yüzlere yuvarlamaya yarar. Ek bir bağımsız değişkene sıfırdan farklı bir değer verilirse sayı yuvarlanmak yerine kesilir (truncate).

SELECT ROUND(10.0 / 3, 2) AS ortalama;

Bu sorgu sonucu belirtilen ondalık basamağa yuvarlar. Yarım değerlerde (tam ortada kalan) SQL Server, belgeye göre sıfırdan uzağa yuvarlar; yani yarım değer pozitifte yukarı, negatifte aşağı gider. PostgreSQL belgesi, numeric tipinde yarım değerlerin aynı şekilde sıfırdan uzağa yuvarlandığını, kayan noktalı tiplerde (real ve double precision) ise davranışın platforma bağlı olduğunu ve çoğunlukla en yakın çift sayıya gidildiğini belirtir. Aynı sayı farklı tiplerde farklı yuvarlanabilir; bu yüzden para ve oran hesaplarında kesin tip kullanılır. MySQL'de de kesin (DECIMAL) değerler sıfırdan uzağa yuvarlanır; yaklaşık değerlerde sonuç sistemin C kütüphanesine bağlıdır ve birçok sistemde en yakın çift sayıya gidilir.

PostgreSQL'de basamak alan ROUND, numeric tipi için tanımlıdır; kayan noktalı bir kolonu basamağa yuvarlamak için önce numeric tipe çevirmeniz gerekir. SQL Server'da ROUND, girdinin tipini korur: DECIMAL girdi DECIMAL döner. Bu yüzden sonucun taşabileceği durumlarda önce daha geniş bir tipe çevirmek gerekir.

CEILING ve FLOOR: yukarı ve aşağı yuvarlama

CEILING bir sayıyı kendinden büyük ya da eşit en küçük tam sayıya, FLOOR ise kendinden küçük ya da eşit en büyük tam sayıya çevirir. İkisi de ondalık kısmın yönüne değil, sayı doğrusundaki yöne bakar; bu ayrım negatif sayılarda belirginleşir: negatif bir sayıda CEILING sıfıra yaklaşır, FLOOR sıfırdan uzaklaşır. Pozitif sayılarda ise CEILING ondalığı yukarı atar, FLOOR kesilmiş tam sayı kısmı bırakır.

Günlük işlerde CEILING'in en yararlı kullanımı "en az kaç tane gerekir" sorularıdır:

SELECT CEILING(toplam_satir * 1.0 / sayfa_boyutu) AS sayfa_sayisi FROM sonuc_ozeti;

Bir sonuç listesini sayfalara bölerken artan satırlar için yeni bir sayfa gerekir; CEILING bunu doğru sayar, ROUND ise yarım değerin altında sayfayı eksik bırakır. Aynı mantık koli, araç ya da vardiya sayısı hesaplarında da geçerlidir. FLOOR ise "tam kaç tane doldu" sorusunda kullanılır.

Tam sayıya yuvarlanan bir sonucun neden bölme tipine bağlı olduğunu unutmayın: CEILING içine konan ifade tam sayı bölmesiyse yukarı yuvarlanacak ondalık kısım daha önce atılmıştır ve CEILING yanlış sonucu yine tam sayı olarak döndürür. Bu yüzden bölmede ondalık tip kullanma kuralı burada da geçerlidir. PostgreSQL ve MySQL'de CEIL kısaltması da kullanılabilir; SQL Server'da CEILING yazılır.

Yuvarlamayı ne zaman yapmalı?

Yuvarlamayı hesabın sonunda, gösterimden hemen önce yapın. Ara adımlarda yuvarlanan sayılar hataları biriktirir. Satır bazında yuvarlanmış değerlerin toplamı, toplamın yuvarlanmış hâlinden küçük bir farkla ayrışabilir; fatura gibi toplamın kuruşu kuruşuna tutması gereken yerlerde bu fark sorun yaratır. Hangisinin doğru olduğu iş kuralına bağlıdır: önce satır yuvarlayıp mı toplayacaksınız, önce toplayıp mı yuvarlayacaksınız? Bu kararı muhasebe ya da iş birimiyle netleştirip sorguya açıkça yazın.

Veri tipi seçimi de yuvarlamayı etkiler. Kayan noktalı tipler bazı ondalık değerleri tam gösteremez, bu yüzden toplamlar ya da eşitlik karşılaştırmaları beklenmedik sonuç verebilir. Para, oran ve kesin ölçüler için DECIMAL kullanın ve basamak sayısını tablo tasarımında belirleyin.

Son olarak, gösterim ile hesabı ayırın. Raporda belirli bir basamak görünmesi için sayıyı biçimlendirmek yetebilir; yuvarlanmış değeri sonraki hesaplarda kullanıyorsanız kayıp bilgi olduğunu bilin.

Sık hatalar ve kontrol listesi

Hesaplama sorgularındaki hatalar benzer kalıplarda toplanır.

  • Tam sayı bölmesini ondalık sanmak: bölünenin tipini kontrol edin.
  • ROUND ile CEILING'i karıştırmak: sayma işlerinde yukarı yuvarlama gerekir.
  • Yüzdeyi tam sayı bölmesiyle hesaplamak: parça bütünden küçükse oran sıfır çıkar.
  • Ara sonuçları yuvarlamak: yuvarlamayı hesabın en sonuna bırakın.
  • Kayan noktalı tiple para hesabı yapmak.
  • Sıfıra bölmeyi hesaba katmamak: payda sıfırsa SQL Server ve PostgreSQL hata verir, MySQL ise NULL döndürür; paydayı NULLIF ile sıfırdan koruyun.

Sorguyu raporlamadan önce birkaç küçük örnekle sınayın: tam bölünen bir sayı, yarım değere denk gelen bir sayı ve negatif bir sayı. Hepsinin sonucunu elle hesaplayıp karşılaştırın. Oran ve yüzde hesaplarının ayrıntısı için ayrı bir kılavuz gerekir.

Bu beceriyi Mindset programında nerede çalışırsınız?

Mindset'in SQL ile Programlama Eğitimi, Hesaplamalar modülünde sorgu içi hesaplamaları ele alır. Rapor hazırlayan analistler ve veri sorgulayan geliştiriciler için asıl kazanım, rakamın doğru çıkmasını sorgunun yapısıyla güvence altına almaktır.

Kendi raporlarınızdan bir ortalama ya da oranı seçip bölünenlerin tipini değiştirerek sonucun nasıl farklılaştığını görmek iyi bir başlangıç alıştırmasıdır.

İlgili Mindset programı

SQL ile Programlama Eğitimi

Sık sorulanlar

Sık sorulan sorular

SQL'de neden 10 bölü 3 sonucu 3 çıkıyor?

SQL Server ve PostgreSQL'de iki tam sayının bölümü tam sayıdır ve ondalık kısım atılır. Ondalıklı sonuç için bölünenlerden birini ondalık tipe çevirin ya da ondalık bir sabitle çarpın. MySQL'de ise bölme işleci ondalık sonuç verir, tam sayı bölmesi için DIV kullanılır.

ROUND ile CEILING arasındaki fark nedir?

ROUND sayıyı en yakın değere yuvarlar; yarım değer aşağı ya da yukarı gidebilir. CEILING ise ondalık kısmı ne olursa olsun sayıyı yukarı tam sayıya taşır. Kaç sayfa ya da kaç koli gerektiği gibi "en az kaç" sorularında CEILING doğru sonucu verir.

Negatif sayılarda yuvarlama nasıl çalışır?

ROUND yarım değerlerde sıfırdan uzağa gider; yani eksi yarım değer eksi yönünde yuvarlanır. CEILING sayıyı sayı doğrusunda yukarı, yani sıfıra doğru taşır, FLOOR ise aşağı, yani sıfırdan uzağa. Negatif veride her fonksiyonu küçük bir örnekle sınayın.

Para hesabında FLOAT mı DECIMAL mi kullanmalıyım?

DECIMAL. Kesin basamak sayısı tanımlayabilirsiniz ve yuvarlama davranışı öngörülebilirdir. Kayan noktalı tipler yaklaşık değer tutar; bazı ondalık sayıları tam gösteremez ve yarım değerlerde sistem ya da platforma göre farklı yuvarlayabilir.

Yuvarlamayı sorguda mı yoksa raporda mı yapmalıyım?

Hesapta kullanılacak değeri sorguda yuvarlamak, yalnızca görünüm için olan biçimlendirmeyi raporlama aracında yapmak iyi bir ayrımdır. Yuvarlanmış değer sonraki hesaba girecekse kayıp bilgi doğurur; bu nedenle yuvarlamayı hesabın en sonunda uygulayın.

SQL ROUND, CEILING, FLOOR ve Tam Sayı Bölme Sorunu