SQL gelistirme

Firebird ve Interbase veritabanları ve SQL komutlarıyla ilgli sorularınızı sorabilirsiniz. Delphi tarafındaki sorularınızı lütfen Programlama forumunda sorunuz.
Cevapla
abdulkadir
Kıdemli Üye
Mesajlar: 489
Kayıt: 13 Eyl 2003 09:10
Konum: istanbul
İletişim:

SQL gelistirme

Mesaj gönderen abdulkadir »

s.a
arkadaslar aslında bir sorunum yok ama yanlısmı yapıyorum diye fikrinize almak istedim
acıkcası uzun bir konu olacagı için daha önceden sormaktan vazgecmiştim ama SQL karmasıklasınca degerli fikirlerinizi almak istedim.

kayıtlı carilerimiz CARI tablosuna kaydedilir.
bu carilere ait servisler CARI_SERVIS tablosuna kaydedilir.
CARI_SERVIS tablosunda bulunan servislere kesilen fişler SERVIS tablosuna kaydedilir.

biz bu 3 tablodan raporlama yapıyoruz.
hangi carinin kac servisi var hangi servis kac arıza yamış cari ve servis bazında maliyetler.

simdi SQL koduna bakalım.
bu SQL de cariye ait servisler, servis sayısı ve servislerin belirtilen tarih aralıgındaki arıza sayısı bulunmaktadır sonucları dogru vermektedir.

Kod: Tümünü seç

SELECT  C.*, CS.*, 
(SELECT COUNT(*) FROM CARI_SERVIS CS   WHERE CS.BLCRKODU = C.BLKODU ) AS CariServisSayisi,
(SELECT COUNT(*) FROM SERVIS S WHERE S.SILINDI=0 AND S.URUN_ADI = CS.URUN_ADI
  AND S.OZELALANTANIM_27 = 'ARIZA'
  AND S.GELIS_TARIHI >= '01.04.2010' AND S.GELIS_TARIHI <= '30.04.2010')AS ServisArizaSayisi
 FROM CARI_SERVIS CS  INNER JOIN CARI C ON (CS.BLCRKODU = C.BLKODU)
  WHERE C.BLKODU=CS.BLCRKODU
   AND UPPER(CARIKODU)LIKE UPPER('CR00095' COLLATE PXW_TURK)
   AND COALESCE(C.AKTIF,1)=1
   AND COALESCE(CS.AKTIF,1)=1
 ORDER BY C.TICARI_UNVANI ASC, CS.URUN_ADI ASC 
şimdi biraz daha detaylara ihtiyacımız var

Kod: Tümünü seç

SELECT  C.*, CS.*, 
/* cari bazında bilgiler */
(SELECT COUNT(*) FROM CARI_SERVIS CS   WHERE CS.BLCRKODU = C.BLKODU ) AS CariServisSayisi,
(SELECT COUNT(*) FROM SERVIS S WHERE S.BLCRKODU = C.BLKODU AND S.OZELALANTANIM_27='ARIZA') AS CariArizaSayisi,
(SELECT COUNT(*) FROM SERVIS S WHERE S.BLCRKODU = C.BLKODU AND S.OZELALANTANIM_27='PERİYODİK BAKIM') AS CariBakimSayisi,
(SELECT SUM(TOPLAM_PARCA_KPB) FROM SERVIS S WHERE S.BLCRKODU = C.BLKODU) AS CariToplamParca,
(SELECT SUM(TOPLAM_ISCILIK_KPB) FROM SERVIS S WHERE S.BLCRKODU = C.BLKODU) AS CariToplamiscilik,
(SELECT SUM(TOPLAM_KDV_KPB) FROM SERVIS S WHERE S.BLCRKODU = C.BLKODU) AS CariToplamKdv ,
(SELECT SUM(TOPLAM_GENEL_KPB) FROM SERVIS S WHERE S.BLCRKODU = C.BLKODU) AS CariGenelToplam ,

/* ---ServisArizaSayisi--- */
(SELECT COUNT(*) FROM SERVIS S WHERE S.SILINDI=0
AND S.URUN_ADI = CS.URUN_ADI AND S.OZELALANTANIM_27 = 'ARIZA'
 AND S.GELIS_TARIHI >= '01.04.2010' AND S.GELIS_TARIHI <= '30.04.2010'
) AS ServisArizaSayisi ,

/* ---ServisBakimSayisi--- */
(SELECT COUNT(*) FROM SERVIS S WHERE S.SILINDI=0 
AND  S.URUN_ADI = CS.URUN_ADI AND S.OZELALANTANIM_27 = 'PERİYODİK BAKIM'
 AND S.GELIS_TARIHI >= '01.04.2010' AND S.GELIS_TARIHI <= '30.04.2010'
)  AS ServisBakimSayisi ,

/* ---ServisToplamParca--- */
(SELECT SUM(TOPLAM_PARCA_KPB) FROM SERVIS S WHERE S.SILINDI=0 
AND  S.URUN_ADI = CS.URUN_ADI
 AND S.GELIS_TARIHI >= '01.04.2010' AND S.GELIS_TARIHI <= '30.04.2010'
) AS ServisToplamParca ,

/* ---ServisToplamiscilik--- */
(SELECT SUM(TOPLAM_ISCILIK_KPB) FROM SERVIS S WHERE S.SILINDI=0
AND  S.URUN_ADI = CS.URUN_ADI
 AND S.GELIS_TARIHI >= '01.04.2010' AND S.GELIS_TARIHI <= '30.04.2010'
)  AS ServisToplamiscilik ,

/* ---ServisToplamKdv--- */
(SELECT SUM(TOPLAM_KDV_KPB) FROM SERVIS S WHERE S.SILINDI=0
AND  S.URUN_ADI = CS.URUN_ADI
 AND S.GELIS_TARIHI >= '01.04.2010' AND S.GELIS_TARIHI <= '30.04.2010'
) AS ServisToplamKdv ,

/* ---ServisGenelToplam--- */
(SELECT SUM(TOPLAM_GENEL_KPB) FROM SERVIS S WHERE S.SILINDI=0
AND  S.URUN_ADI = CS.URUN_ADI
 AND S.GELIS_TARIHI >= '01.04.2010' AND S.GELIS_TARIHI <= '30.04.2010'
) AS ServisGenelToplam

 FROM CARI_SERVIS CS  INNER JOIN CARI C ON (CS.BLCRKODU = C.BLKODU)
  WHERE C.BLKODU=CS.BLCRKODU

AND UPPER(CARIKODU)LIKE UPPER('CR00095' COLLATE PXW_TURK)
AND COALESCE(C.AKTIF,1)=1
AND COALESCE(CS.AKTIF,1)=1

ORDER BY C.TICARI_UNVANI ASC, ServisArizaSayisi DESC, CS.URUN_ADI ASC 
SQL artık kasmaya basladı ve hala filitre kriterleri girilecek seyler var
evet benim Sormak istedigim
bu kullandıgım SQL den daha az kod yazabilirmiyim ve daha hızlı rapor alabilecegim yöntem varmı
dogru sonuc alsamda daha dogrusu veya daha iyisi varsa ögrenip yola devam edeyim
Şimdiden tesekkürler
Fikirleri Aktar
Kaynakları Dagıt
Ve
Yoldan Çekil
http://www.Leventler.com.tr
Kullanıcı avatarı
sabanakman
Kıdemli Üye
Mesajlar: 3081
Kayıt: 17 Nis 2006 08:11
Konum: Ah bi Antalya olaydı keşke (Ankara)

Re: SQL gelistirme

Mesaj gönderen sabanakman »

Merhaba, sorgunuzu çok detaylıca inceleyedim ama ilk gözüme çarpan nokta için önerim var.

Kod: Tümünü seç

SELECT  C.*, CS.*, 
(SELECT COUNT(*) FROM CARI_SERVIS CS   WHERE CS.BLCRKODU = C.BLKODU ) AS CariServisSayisi,
....
FROM CARI_SERVIS CS....
Yapısında kullanılan sorgu, her CS kaydı için alt sorgudaki tüm CARI_SERVIS kayıtlarını tarayacaktır. Bunun yerine

Kod: Tümünü seç

SELECT  C.*, CS.*, 
ALT_CS.CariServisSayisi,
....
FROM CARI_SERVIS CS....
LEFT JOIN (SELECT BLCRKODU, COUNT(*) as CariServisSayisi FROM CARI_SERVIS GROUP BY BLCRKODU) as ALT_CS on ALT_CS.BLCRKODU=CS.BLCRKODU
....
şeklinde yazılmış alt sorgularda hesaplanmış değerleri join yapmanız durumunda daha performanslı çalışan sorgular yazabilirsiniz. İyi çalışmalar.
Şaban Şahin AKMAN
_________________
Derin olan kuyu değil kısa olan iptir. - .
Kullanıcı avatarı
aslangeri
Moderator
Mesajlar: 4322
Kayıt: 26 Ara 2003 04:19
Konum: Ankara
İletişim:

Re: SQL gelistirme

Mesaj gönderen aslangeri »

s.a.
bence bir view hazırlayın. en alttaki tablodaki kayıtları seçsin.
üstteki kayıtlarıda joinle birleştirsin.
üç tabloyu tek tablo gibi göstersin.
böylelikle tek bir viewdan bütün raporlarınızı alabilirsiniz.
şöyle bişey olacak.

Kod: Tümünü seç

select servis.* ,cari_servis.*, cari.* from
servis
left join cari_servis on cari_Servis.id=servis.cari_servisid
left join cari.id=cari_Servis.cariid
gibi...
sonra bu viewdan istediğinzi raporu alabilirsiniz.
hızmı 8)
Duyduğun Şeylerin Söylediklerim Olduğuna Eminim Ama
Anladığın Şeylerin Anlatmak İstediklerim Olduğuna Emin Değilim
abdulkadir
Kıdemli Üye
Mesajlar: 489
Kayıt: 13 Eyl 2003 09:10
Konum: istanbul
İletişim:

Re: SQL gelistirme

Mesaj gönderen abdulkadir »

cari bazında yapılan raporlarda fazla filitre kriteri olmayacagı için önerinizi uygulayacagım.
sabanakman yazdı: Yapısında kullanılan sorgu, her CS kaydı için alt sorgudaki tüm CARI_SERVIS kayıtlarını tarayacaktır. Bunun yerine

Kod: Tümünü seç

SELECT  C.*, CS.*, 
ALT_CS.CariServisSayisi,
....
FROM CARI_SERVIS CS....
LEFT JOIN (SELECT BLCRKODU, COUNT(*) as CariServisSayisi FROM CARI_SERVIS GROUP BY BLCRKODU) as ALT_CS on ALT_CS.BLCRKODU=CS.BLCRKODU
....
şeklinde yazılmış alt sorgularda hesaplanmış değerleri join yapmanız durumunda daha performanslı çalışan sorgular yazabilirsiniz. İyi çalışmalar.
ben bu tablolardan yıllık rapor almak istiyorum hangi ürün hangi aylarda kac defa servisi gelmiş
nasıl yapmam gerektigi hakkında yardımcı olabilirmisiniz...
söyle birşey olmalı.
dbgrid 13 kolondan oluşmalı title da
ürün adı-ocak-subat-mart-nisan-mayıs-haziran-temmuz-agustos-eyylül-ekim-kasım-aralık
yani
a ürün-2-3-2-1-1-1-1-1-1-1-1-1
b ürün-0-0-0-2-1-2-1-1-1-1-1-1
c ürün-5-3-2-1-1-1-1-1-1-1-1-1
a,b,c carinin CARİ_SERVIS tablosunda kac tane ürünü varsa o kadar satır olacak.
(NOT raporlama için fastreport kullanıyorum)
ilginize tesekkür ederim.
Fikirleri Aktar
Kaynakları Dagıt
Ve
Yoldan Çekil
http://www.Leventler.com.tr
Kullanıcı avatarı
aslangeri
Moderator
Mesajlar: 4322
Kayıt: 26 Ara 2003 04:19
Konum: Ankara
İletişim:

Re: SQL gelistirme

Mesaj gönderen aslangeri »

s.a.
hazırladığımız sorgu ile şu sonucu görmeiz lazım

Kod: Tümünü seç

ürünkodu   ay   miktar
a---------1-----5
b---------1-----4
a--------3-----3
sonra bu viewden ( adı liste olsun) şöyle bir select cümlesi ile ikinci bir view (liste2 olsun)oluşturacağız.

Kod: Tümünü seç

select ürünkodu, ay ,
case ay when 1 den miktar else 0 end as ocak,
case ay when 2 den miktar else 0 end as şubat,
.....
case ay when 12 den miktar else 0 end as aralık,
daha sonra son viewdan da sonuçları alacağız

Kod: Tümünü seç

select ürünkodu,ay,sum(ocak)..... from liste2 group by ürünkodu,ay
kolay gelsin
Duyduğun Şeylerin Söylediklerim Olduğuna Eminim Ama
Anladığın Şeylerin Anlatmak İstediklerim Olduğuna Emin Değilim
Cevapla