SQL ile aynı anda 20 table den sum alma

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
Cevapla
Kullanıcı avatarı
musti
Üye
Mesajlar: 527
Kayıt: 11 Tem 2005 09:44

SQL ile aynı anda 20 table den sum alma

Mesaj gönderen musti »

Selamun aleykum

sizce
bir alanınız vr 20 aden tablede ve bunların toplamını almak istiyorsunuz en iyi şekilde nasıl yaparsınız(JOINLERLE UZUN OLUYOR)


ORTAK field KODU OLSUN
TABLE LERDE TABLE1,TABLE2,TABLE3.............TABLE20 OLSUN
TOPLAN ALINIACAK FIELD DE BORC OLSUN

teşekkürler
Uğur1982
Üye
Mesajlar: 383
Kayıt: 11 Mar 2005 03:18
Konum: İzmir

Mesaj gönderen Uğur1982 »

a.s

En basiti şu şekilde..

Kod: Tümünü seç

Select sum(T1.BORC),Sum(T2.BORC),Sum(T3.BORC)..... ,Sum(T20.BORC) from TABLO1 T1,TABLO2 T2,TABLO3 T3.....TABLO20 T20
20 table dediğin için ne yapsan kod yerine göre biraz uzun olacaktır...
Kullanıcı avatarı
musti
Üye
Mesajlar: 527
Kayıt: 11 Tem 2005 09:44

Mesaj gönderen musti »

tsk ederim ilgin icin ama sanırım yanlıs anlattım
tek bir sum icinde olacak 20 tane ayri sum degil ve dosya birlestirme olunca cok agir oluyor.
Uğur1982
Üye
Mesajlar: 383
Kayıt: 11 Mar 2005 03:18
Konum: İzmir

Mesaj gönderen Uğur1982 »

Kod: Tümünü seç

Select sum(T1.BORC+T2.BORC+T3.BORC+.....T20.BORC) as BUTUNTOPLAM from TABLO1 T1,TABLO2 T2,TABLO3 T3.....TABLO20 T20
Böyle çalışması lazım..
Kullanıcı avatarı
fahrettin
Admin
Mesajlar: 2619
Kayıt: 11 Haz 2003 10:38
Konum: İstanbul
İletişim:

Mesaj gönderen fahrettin »

Sayin Uğur1982,
eger form icine butun tablolari siralarsak bu bir kartezyen carpima neden olur.. 20 tabloda 2 ser kayıt bile olsa normalde 40 kaydın toplamını almamiz gerekirken kartezyen carpim sonucu olusan kayıtların sonucu 2*2*2*2*2.... 2 nin 20 kuvveti adedinde kayıt olusur... Eger kayıt sayıları da fazla ise trilyonlarca kaydı toplamaya calisir ki bunu da pratik olarak yapamaz....

aklıma gelen ilk yontem su

Kod: Tümünü seç

Selec (Select sum(ALAN1) fron TABLO1)+
(Select sum(ALAN1) fron TABLO2)+
(Select sum(ALAN1) fron TABLO3)+
(Select sum(ALAN1) fron TABLO4)+
(Select sum(ALAN1) fron TABLO5)+
.....
Fakat boyle bir soru veritabanı tasarımında bir problem var mı sorusunu da akla getiriyor..... Karşılaşılması gereken bir problem gibi durmuyor açıkcası.....
* http://www.fahrettin.org Manzara Fotoğraflarım... :)
* http://delphiturkiye.gunduz.info Seminerler... ;)
* http://www.hakmar.com.tr Kalite bir haktır... 8)
Uğur1982
Üye
Mesajlar: 383
Kayıt: 11 Mar 2005 03:18
Konum: İzmir

Mesaj gönderen Uğur1982 »

Evet hocam onu düşünmemiştim. :(

Düzelttiğiniz için teşekkür ederim..

iyi günler..
Kullanıcı avatarı
musti
Üye
Mesajlar: 527
Kayıt: 11 Tem 2005 09:44

Mesaj gönderen musti »

hocam saygılar

Selec (Select sum(ALAN1) fron TABLO1)+
(Select sum(ALAN1) fron TABLO2)+
(Select sum(ALAN1) fron TABLO3)+
(Select sum(ALAN1) fron TABLO4)+
(Select sum(ALAN1) fron TABLO5)

ibconsole dada queryde de denedim calismadi. umarim yanlıs anlamadım hepsi tek bir sql sorgusu degilmi yani ayri ayri degil.

Veri tabanım 12 ay lı bilgileri tutan 12 ayrı table dan olusan bir vt
Filedlarda
FISNO,TARIH,KODU, BORC,ALACAK,ACIKLAMA,NO SEKLINDE

her bir table da yaklasik 10.000 transaction var. ve sadece ilgili aylarda islem yapılıyorum yani su an 8 ay table nında.
rapor alınırkende genelde bulundugu ay veya bulundugu ay kadar olan butun aylardaki toplamlar isteniyor.
bende hepsini tek bir table degilde 12 ayri table da tuyayim dedim.

tskler
Kullanıcı avatarı
fahrettin
Admin
Mesajlar: 2619
Kayıt: 11 Haz 2003 10:38
Konum: İstanbul
İletişim:

Mesaj gönderen fahrettin »

bu arada veritabanınız firebird galiba degil mi?
simdi burada yazdigim cümlenin ozu

Kod: Tümünü seç

Select 10+30+40+90+......
gibi bir şey....
belki from olmadigi icin çalıştırmamış olabilir sybase den kalma alışkanlık bu tur kodlarda fromu unutsanızda hic sizi bozmadan meseleyi sineye çekip çalıştırıyor....

siz ona bir from ekleyin.... kesinlikle ve kesinlikle tek kayıtlı bir tablonuz varsa onu ekleyin yoksa da oracle ve sybsase de dummy diye bir tablo var bu işler için varsa onu kullanıın...

Kod: Tümünü seç

Selec (Select sum(ALAN1) fron TABLO1)+
(Select sum(ALAN1) fron TABLO2)+
(Select sum(ALAN1) fron TABLO3)+
(Select sum(ALAN1) fron TABLO4)+
(Select sum(ALAN1) fron TABLO5)+
.....
from dummy
gibi.....

bu arada yapıyı tam anlamadım ama anladıgım kadarı ile ben olsaydım bunu 12 ayrı tablo yerine tek tablo yapıp bir ay kodu veya yıl+ay bilgisini eklerdim.... Bu tur konsolide raporlar cok daha kolaylaşırdı....

Neyse bu vakitten sonra yapı degisikligi hem zor olabilir hem de ben tam olarak dogru anlamamıs oldugum icin fazla da kafanızı karıstırmıs olmayayım.....

Ama sonuc olarak yukardaki kodda ısrar ederseniz çalışacaktır :D
* http://www.fahrettin.org Manzara Fotoğraflarım... :)
* http://delphiturkiye.gunduz.info Seminerler... ;)
* http://www.hakmar.com.tr Kalite bir haktır... 8)
Kullanıcı avatarı
musti
Üye
Mesajlar: 527
Kayıt: 11 Tem 2005 09:44

Mesaj gönderen musti »

fron lar from diye degistirdim ama dummy anlamadım hocam
evet interbase vt

neden tek table da yapmadım hocam soyliyim her bir ayda 10.000 den 12 ayda 120.000 hareket ediyor bende 12 ayrı table adeyim dedim bir sorun olursa bir table de olsun diye ve daha hızlı osun diye sizce yanlismi ?
120.000 kayit icinden sorgulamaktansa 10.000 in icinde daha kolay olur dedim yoksa farketmezmi where ye aykodu da yazsak aynımı

yani

120.000 HAREKETLİ BİR TABLE DA
select sum (borc) from table
where AY='01'


ile 10.000 hareketli bir table da
select sum (borc) from table1

ayni seymi


bir de dbgrid lede bilgi girerken hız fark edermi ?

tskler
Kullanıcı avatarı
musti
Üye
Mesajlar: 527
Kayıt: 11 Tem 2005 09:44

Mesaj gönderen musti »

hocam duzelttim sql satirlarini ve toplamlarını alıyorum biraz yavas ama isimi goruyor amam buyuk bir problemimim var eger table lerin her hangi birim de o olan null veya 0 ise gelen sonuc null oluyor :(
P206
Kıdemli Üye
Mesajlar: 395
Kayıt: 17 Haz 2003 12:36
Konum: İstanbul

Mesaj gönderen P206 »

select lere where xx is not null eklemeyi dene
I love my car.
Blog Yaptık
Kullanıcı avatarı
musti
Üye
Mesajlar: 527
Kayıt: 11 Tem 2005 09:44

Mesaj gönderen musti »

not null ile cozum olmuyor degisen bise yok yine null geliyor
Kullanıcı avatarı
fahrettin
Admin
Mesajlar: 2619
Kayıt: 11 Haz 2003 10:38
Konum: İstanbul
İletişim:

Mesaj gönderen fahrettin »

evet from yerine fron yazmisim... :(
musti yazdı:120.000 HAREKETLİ BİR TABLE DA
select sum (borc) from table
where AY='01'


ile 10.000 hareketli bir table da
select sum (borc) from table1

ayni seymi
Teorik olarak olmasa bile eger AY alanına gore bir indexiniz olursa ve bunun disinda diger indezlerinizin de en azindan gerekli olanlarının da en basina yine AY alanını eklerseniz pratik olarak aynı olur. Yani aradaki farki kolay kolay olcemezsiniz....
Bilgi giris ve de her turlu gosterim ekraninda Query kullandiginiz surece de perforformans probleminiz olmaz....

Kod: Tümünü seç

Selec (Select sum(ALAN1) from TABLO1 where ALAN1 is not null)+
(Select sum(ALAN1) from TABLO2 where ALAN1 is not null)+
(Select sum(ALAN1) from TABLO3 where ALAN1 is not null)+
(Select sum(ALAN1) from TABLO4 where ALAN1 is not null)+
(Select sum(ALAN1) from TABLO5 where ALAN1 is not null)+
.....
seklinde olmasi lazim.... Fakat herhangi bir select'te olmaz ise bir subquery null donmesi toplam sonucun null olmasina nede nolur....

Ya da sybase de isnull e karsilik gelen firebird de bir fonksiyon vardi. Su an hatırlıyamıyorum o fonksiyonu kullanabilirsiniz....

Kod: Tümünü seç

Selec (Select sum(isnull(ALAN1,0)) from TABLO1)+
(Select sum(isnull(ALAN1,0)) from TABLO2)+
(Select sum(isnull(ALAN1,0)) from TABLO3)+
(Select sum(isnull(ALAN1,0)) from TABLO4)+
(Select sum(isnull(ALAN1,0)) from TABLO5)+
..... 
Bu fonksiyon ile null olan degerler yerine hesaba sıfır katılacagi icin toplam null olmayacaktir.... Tabi siz isnull yerine ilgili firebird fonksiyonunu kullanmalisiniz. Belki hatirlayan bir arkadas soyleyebilir ya da siz help ten bulabilirsiniz....
* http://www.fahrettin.org Manzara Fotoğraflarım... :)
* http://delphiturkiye.gunduz.info Seminerler... ;)
* http://www.hakmar.com.tr Kalite bir haktır... 8)
Cevapla