iki tarih arasında 0 dan büyük değer alan alanları toplama
Forum kuralları
Forum kurallarını okuyup, uyunuz!
Forum kurallarını okuyup, uyunuz!
Yok recep abi estağfurullah haddimiz değil. Daha emekleme çağındayız. Hatta onu bile yapamıyoruz. Bizimkisi çocukça bir sevinç işte. Paylaşmak istedim. Bir şey yapabiliyorsak sizlerin eseri, yok beceremiyorsak bizim beceriksizliğimizdir.
Kolay gelsin
Kolay gelsin
Şefkat-u Merhamette Güneş Gibi Ol.
Başkalarının Kusurunu Örtmekte Gece Gibi Ol.
Sehavet-u Cömertlikte Akarsu Gibi Ol.
Hiddet-u Asabiyette Ölü Gibi Ol.
Tevazu-u Mahviyette Toprak Gibi Ol.
Ya Olduğun Gibi Görün Ya Göründüğün Gibi Ol.

Başkalarının Kusurunu Örtmekte Gece Gibi Ol.
Sehavet-u Cömertlikte Akarsu Gibi Ol.
Hiddet-u Asabiyette Ölü Gibi Ol.
Tevazu-u Mahviyette Toprak Gibi Ol.
Ya Olduğun Gibi Görün Ya Göründüğün Gibi Ol.

Acemiliğime verin bu sp yi tek alan için önceki verdiğim şekilde yazdım. ama acemilikle dokuz sp yazdım. bu gün tekrar üzerine düştüm ve tek sp ile bu dokuz alanı sorguluyor ve sonuç alıyorum. her hangi bir sakıncası varmı?
kolay gelsin
kolay gelsin
Şefkat-u Merhamette Güneş Gibi Ol.
Başkalarının Kusurunu Örtmekte Gece Gibi Ol.
Sehavet-u Cömertlikte Akarsu Gibi Ol.
Hiddet-u Asabiyette Ölü Gibi Ol.
Tevazu-u Mahviyette Toprak Gibi Ol.
Ya Olduğun Gibi Görün Ya Göründüğün Gibi Ol.

Başkalarının Kusurunu Örtmekte Gece Gibi Ol.
Sehavet-u Cömertlikte Akarsu Gibi Ol.
Hiddet-u Asabiyette Ölü Gibi Ol.
Tevazu-u Mahviyette Toprak Gibi Ol.
Ya Olduğun Gibi Görün Ya Göründüğün Gibi Ol.

Kod: Tümünü seç
CREATE PROCEDURE SP_ISTOLYTURU_SAY (
TARIH1 DATE,
TARIH2 DATE)
RETURNS (
EVDEN_ADET INTEGER,
ISYERI_ADET INTEGER,
OTODAN_ADET INTEGER,
OTOHIR_ADET INTEGER,
CINAYET_ADET INTEGER,
YARALAMA_ADET INTEGER,
MOLOTOF_ADET INTEGER,
INTIHAR_ADET INTEGER,
SUPOLUM_ADET INTEGER,
GASP_ADET INTEGER,
DIGER_ADET INTEGER)
AS
begin
/* Procedure Text */
SELECT COUNT(ISTOLYTURU) from raporlar
WHERE INCTARIHI BETWEEN :TARIH1 AND :TARIH2 AND ISTOLYTURU='EVDEN HIRSIZLIK'
into :evden_adet;
SELECT COUNT(ISTOLYTURU) from raporlar
WHERE INCTARIHI BETWEEN :TARIH1 AND :TARIH2 AND ISTOLYTURU='İŞYERİNDEN HIRSIZLIK'
into :isyeri_adet;
SELECT COUNT(ISTOLYTURU) from raporlar
WHERE INCTARIHI BETWEEN :TARIH1 AND :TARIH2 AND ISTOLYTURU='OTODAN HIRSIZLIK'
into :otodan_adet;
SELECT COUNT(ISTOLYTURU) from raporlar
WHERE INCTARIHI BETWEEN :TARIH1 AND :TARIH2 AND ISTOLYTURU='OTO HIRSIZLIĞI (TERK OTO)'
into :otohir_adet;
SELECT COUNT(ISTOLYTURU) from raporlar
WHERE INCTARIHI BETWEEN :TARIH1 AND :TARIH2 AND ISTOLYTURU='CİNAYET'
into :cinayet_adet;
SELECT COUNT(ISTOLYTURU) from raporlar
WHERE INCTARIHI BETWEEN :TARIH1 AND :TARIH2 AND ISTOLYTURU='YARALAMA'
into :yaralama_adet;
SELECT COUNT(ISTOLYTURU) from raporlar
WHERE INCTARIHI BETWEEN :TARIH1 AND :TARIH2 AND ISTOLYTURU='MOLOTOF'
into :molotof_adet;
SELECT COUNT(ISTOLYTURU) from raporlar
WHERE INCTARIHI BETWEEN :TARIH1 AND :TARIH2 AND ISTOLYTURU='İNTİHAR'
into :intihar_adet;
SELECT COUNT(ISTOLYTURU) from raporlar
WHERE INCTARIHI BETWEEN :TARIH1 AND :TARIH2 AND ISTOLYTURU='ŞÜPHELİ ÖLÜM'
into :supolum_adet;
SELECT COUNT(ISTOLYTURU) from raporlar
WHERE INCTARIHI BETWEEN :TARIH1 AND :TARIH2 AND ISTOLYTURU='GASP'
into :gasp_adet;
SELECT COUNT(ISTOLYTURU) from raporlar
WHERE INCTARIHI BETWEEN :TARIH1 AND :TARIH2 AND ISTOLYTURU='DİĞER'
into :diger_adet;
suspend;
end
Kod: Tümünü seç
procedure TForm1.Button1Click(Sender: TObject);
begin
ibquery1.Close;
ibquery1.ParamByName('TARIH1').AsDate:=datetimepicker1.Date;
ibquery1.ParamByName('TARIH2').AsDate:=datetimepicker2.Date;
ibquery1.Open;
end;
ustalarımın tavsiyelerinde sp ile yap 9 query ile delphi tarafında göster tavsiyeleri üzerine kafam karıştı. tek query ile olursa sorunmu olur ilerde veriler çoğaldıkça yoksa bir sorun olmazmı. modul ler içine beleşen doldurmak istemiyorum açıkçası. 1 query=9 query
kola gelsin
Şefkat-u Merhamette Güneş Gibi Ol.
Başkalarının Kusurunu Örtmekte Gece Gibi Ol.
Sehavet-u Cömertlikte Akarsu Gibi Ol.
Hiddet-u Asabiyette Ölü Gibi Ol.
Tevazu-u Mahviyette Toprak Gibi Ol.
Ya Olduğun Gibi Görün Ya Göründüğün Gibi Ol.

Başkalarının Kusurunu Örtmekte Gece Gibi Ol.
Sehavet-u Cömertlikte Akarsu Gibi Ol.
Hiddet-u Asabiyette Ölü Gibi Ol.
Tevazu-u Mahviyette Toprak Gibi Ol.
Ya Olduğun Gibi Görün Ya Göründüğün Gibi Ol.

Hocam güzel olmuş.
şeklinde her sorgunun altına ekleyebilirsin. Bir de ISTOLYTURU='EVDEN HIRSIZLIK' dediğin yerde yazım farkından dolayı hatalar çıkabilir. Bu ibareleri bir tabloya bağlayıp, bunlara 10,20, 30 ... diye numara versen hem yoğun kayıtlarda hız artar hem de hata oranı düşer
şeklinde 
burada hiç kayıt dönmez ise;Kod: Tümünü seç
SELECT COUNT(ISTOLYTURU) from raporlar WHERE INCTARIHI BETWEEN :TARIH1 AND :TARIH2 AND ISTOLYTURU='EVDEN HIRSIZLIK' into :evden_adet;
Kod: Tümünü seç
IF (evden_adet IS NULL) THEN evden_adet = 0; -- yada işi uzatmadan select içinde COALESCE(COUNT(ISTOLYTURU), 0) from ... şeklinde

Kod: Tümünü seç
SELECT COUNT(ISTOLYTURU) FROM RAPORLAR
WHERE INCTARIHI BETWEEN :TARIH1 AND :TARIH2 AND ISTOLYTURU = 10 -- 'EVDEN HIRSIZLIK'
INTO :EVDEN_ADET;

Bilgiyi paylaşarak artıralım! Hayatı kolaylaştıralım!!
Merhaba,
@Recep ustam tavsiyene katılıyorum bilgisayarlar rakamı sever. Ben bu evden, işyerinden.... gibi isimleri bir tabloda tutuyorum ve kullanıcı lookupcombo dan benim veya yöneticinin yazdığı şekilden başka giremiyor. yani bu suç türleri önceden belirlenip tabloya yazılıyor. ilgili formdada lookup ile kayıt çekilerek kullanıcının seçmesi sağlanıyor. Ama sizin fikriniz hoşuma gitti ve bunu uygulayacağım.
Teşekkür ederim.
Kolay gelsin
@Recep ustam tavsiyene katılıyorum bilgisayarlar rakamı sever. Ben bu evden, işyerinden.... gibi isimleri bir tabloda tutuyorum ve kullanıcı lookupcombo dan benim veya yöneticinin yazdığı şekilden başka giremiyor. yani bu suç türleri önceden belirlenip tabloya yazılıyor. ilgili formdada lookup ile kayıt çekilerek kullanıcının seçmesi sağlanıyor. Ama sizin fikriniz hoşuma gitti ve bunu uygulayacağım.
Teşekkür ederim.
Kolay gelsin
Şefkat-u Merhamette Güneş Gibi Ol.
Başkalarının Kusurunu Örtmekte Gece Gibi Ol.
Sehavet-u Cömertlikte Akarsu Gibi Ol.
Hiddet-u Asabiyette Ölü Gibi Ol.
Tevazu-u Mahviyette Toprak Gibi Ol.
Ya Olduğun Gibi Görün Ya Göründüğün Gibi Ol.

Başkalarının Kusurunu Örtmekte Gece Gibi Ol.
Sehavet-u Cömertlikte Akarsu Gibi Ol.
Hiddet-u Asabiyette Ölü Gibi Ol.
Tevazu-u Mahviyette Toprak Gibi Ol.
Ya Olduğun Gibi Görün Ya Göründüğün Gibi Ol.

Aslında problem çözüldü gibi görünüyor ama ben çözümün normalin biraz dışında olduğunu düşünüyor ve farklı iki bakış açısı getirmek istiyorum.
Öncelikle başlangıçta PARMAK_IZI sayısal bir alan, NOT NULL tanımlanmış ve 0' dan farklı olanlarının COUNT' ları alınıyordu.
Eğer bu ve diğer COUNT' ları alınacak alanları NOT NULL tanımlamamış olsaydınız, basit bir SELECT komutu ile istediğinizi elde edebilirdiniz:
SELECT COUNT(PARMAK_IZI) AS PARMAK, COUNT(AYAK_IZI) AS AYAK, ... FROM RAPORLAR WHERE ...
Burada 0 girmenize gerek kalmayacak ve NULL bırakacaktınız. Sonuçta COUNT() fonksiyonu NULL' ları dikkate almıyor. Adamdan saymıyor
.
İkinci olarak da niye tek bir Query ile yapabileceğiniz bir işi veritabanında STORED PROCEDURE yazarak yapıyorsunuz?
Örneğin şuna benzer bir Query ile istediğiniz sonuca ulaşabilirsiniz:
Bu mantığı en son yapılan STORED PROCEDURE de uygulayabilirsiniz.
İyi çalışmalar.
Öncelikle başlangıçta PARMAK_IZI sayısal bir alan, NOT NULL tanımlanmış ve 0' dan farklı olanlarının COUNT' ları alınıyordu.
Eğer bu ve diğer COUNT' ları alınacak alanları NOT NULL tanımlamamış olsaydınız, basit bir SELECT komutu ile istediğinizi elde edebilirdiniz:
SELECT COUNT(PARMAK_IZI) AS PARMAK, COUNT(AYAK_IZI) AS AYAK, ... FROM RAPORLAR WHERE ...
Burada 0 girmenize gerek kalmayacak ve NULL bırakacaktınız. Sonuçta COUNT() fonksiyonu NULL' ları dikkate almıyor. Adamdan saymıyor

İkinci olarak da niye tek bir Query ile yapabileceğiniz bir işi veritabanında STORED PROCEDURE yazarak yapıyorsunuz?
Örneğin şuna benzer bir Query ile istediğiniz sonuca ulaşabilirsiniz:
Kod: Tümünü seç
SELECT
SUM(CASE WHEN PARMAK_IZI > 0 THEN 1.0 ELSE 0.0 END) AS PARMAK,
SUM(CASE WHEN AYAK_IZI > 0 THEN 1.0 ELSE 0.0 END) AS AYAK,
.
.
.
FROM RAPORLAR
WHERE ...
İyi çalışmalar.
merhaba,
@Hakan ustam, birinci önerinde haklısın ve count işleminde not null alanları hesaba katmadığını öğrenmiş oldum teşekkürler.
İkinci önerinde @Mege ustamın önerisi ile önce query tarafında işlemi çözmüştüm. Önceki yazılarda bunun kodunu vermiştim. Ustalarımın ve daha önce vt tarafında okuduğum yazı ve makalelerde raporlama işlemlerinin vt tarafında sp ile yapılmasının daha faydalı olacağı vurgulanması üzerine sp seçimini yaptım. Dediğiniz gibi delphi tarafında bir query ile sonuç alınabiliyor.
Teşekkür ve saygılarımla
Kolay gelsin
@Hakan ustam, birinci önerinde haklısın ve count işleminde not null alanları hesaba katmadığını öğrenmiş oldum teşekkürler.
İkinci önerinde @Mege ustamın önerisi ile önce query tarafında işlemi çözmüştüm. Önceki yazılarda bunun kodunu vermiştim. Ustalarımın ve daha önce vt tarafında okuduğum yazı ve makalelerde raporlama işlemlerinin vt tarafında sp ile yapılmasının daha faydalı olacağı vurgulanması üzerine sp seçimini yaptım. Dediğiniz gibi delphi tarafında bir query ile sonuç alınabiliyor.
Teşekkür ve saygılarımla
Kolay gelsin
Şefkat-u Merhamette Güneş Gibi Ol.
Başkalarının Kusurunu Örtmekte Gece Gibi Ol.
Sehavet-u Cömertlikte Akarsu Gibi Ol.
Hiddet-u Asabiyette Ölü Gibi Ol.
Tevazu-u Mahviyette Toprak Gibi Ol.
Ya Olduğun Gibi Görün Ya Göründüğün Gibi Ol.

Başkalarının Kusurunu Örtmekte Gece Gibi Ol.
Sehavet-u Cömertlikte Akarsu Gibi Ol.
Hiddet-u Asabiyette Ölü Gibi Ol.
Tevazu-u Mahviyette Toprak Gibi Ol.
Ya Olduğun Gibi Görün Ya Göründüğün Gibi Ol.
