Yorumları: 186
Konuları: 41
Kayıt Tarihi: 19-10-2017
Aktif Kullandığınız Delphi Sürümü:
Rep Puanı: 236 Acemi
(23-07-2024, Saat: 10:04)esistem Adlı Kullanıcıdan Alıntı: Selam,
View kullanarak tablolarınızı yine birleştirin, ama view içerisinde 4 işlem yaptırmayın ve mümkün olduğu kadar az 'if' kullanın, bunun yerine gerekli her türlü veriyi çekip birleştirin, bunu bir Query den çağırıp calculate alan oluşturup hesaplamaları öyle yaptırmayı deneyin.
Örneğin gördüğüm kadarıyla her doviz türü için view içerisinde birçok if kullanarak tl,usd,eur vs.vs. şeklinde ayrı ayrı hesaplamışsınız, bunun yerine para birimi, hareket türü, alış fiyatı, miktar vs.vs. sadece alanları çekip calculate alan ile hesaplatabilirsiniz. Size biraz daha fazla iş çıkartır ama sorgunuz oldukça hızlanacaktır.
Teşekkürler. Sorgu sonucunda hangi para birimi ile ödeme alınmış olursa olsun, hepsinin TL değerini göstermem gerekiyor. Elimde bir tane para birimi alanı var, fiyat var ve o günkü kur bilgileri var. Yani fiyatı hangi kurla çarpacağımı bilmediğim için mecburen IF leri kullanıyorum. Başka bir yöntem bulamadım.
Yorumları: 883
Konuları: 35
Kayıt Tarihi: 12-08-2016
Aktif Kullandığınız Delphi Sürümü:
Rep Puanı: 3.853 Uzman
23-07-2024, Saat: 10:51
(Son Düzenleme: 23-07-2024, Saat: 11:03, Düzenleyen: esistem.)
o zaman işiniz daha kolay, view içerisinde bol bol if kullanıp her defasında hesaplama yaptırmayın,
para birimi, fiyat, miktar ve doviz kuru alanlarını çekin yeter.
daha sonra bunu query ile gösterirken calculate alan ile hesaplatın veya bir stored procedure yazıp onunla çekin.
mesela;
IF ( ((`sh`.`para_birimi` = 1) AND (`sh`.`hareket_turu` = 0)), (`sh`.`alis_fiyati` * `sh`.`miktar`),
IF ( ((`sh`.`para_birimi` = 2) AND (`sh`.`hareket_turu` = 0)), ((`sh`.`alis_fiyati` * `sh`.`miktar`) * `sh`.`euro`),
IF ( ((`sh`.`para_birimi` = 3) AND (`sh`.`hareket_turu` = 0)), ((`sh`.`alis_fiyati` * `sh`.`miktar`) * `sh`.`dolar`),
IF ( ((`sh`.`para_birimi` = 4) AND (`sh`.`hareket_turu` = 0)), ((`sh`.`alis_fiyati` * `sh`.`miktar`) * `sh`.`sterlin`), 0
)))) AS `islemUrun`,
yerine,
select para_birimi, hareket_turu, alis_fiyati, miktar, euro, dolar, sterlin
veya,
para_birimi, hareket_turu, alis_fiyati, miktar,
IF (`sh`.`para_birimi` = 1, 1,
IF (`sh`.`para_birimi` = 2, `sh`.`euro`,
IF (`sh`.`para_birimi` = 3, `sh`.`dolar`,
IF (`sh`.`para_birimi` = 4, `sh`.`sterlin`, 0)))) AS `doviz_kuru`
gibi çekip gösterirken hesaplatabilirsiniz.
Bunun yanında kayıt sayınızı, nasıl gösterdiğinizi vs.vs. bilmiyorum tabi, ama view içerisinde hesaplama yaptırmaktan daha hızlı olacaktır diye düşünüyorum.
ayrıca 10 sn kısa bir zaman, mikro da rapor alırken bazen kahvem bitiyor
Yorumları: 186
Konuları: 41
Kayıt Tarihi: 19-10-2017
Aktif Kullandığınız Delphi Sürümü:
Rep Puanı: 236 Acemi
Sorgudan bütün IF içeren alanları kaldırdım ama hız açısından çok bir şey farketmedi. 6-7 saniye civarı sürüyor. Birleştirdiğim 3 tabloda taş çatlasın 10 bin kayıt var.
Asıl problem hesaplanmış alanların tekrar kullanımında. Ben SELECT ile sonraki satırda bir önceki satırda hesaplanmış alanı kullanıyorum. Bu da sorguyu yavaşlatıyor.
@ ile başlayan değişkenleri de kullandım. O şekilde de 1-2 saniye anca hızlandı, çok bir şey değişmedi.
Bu yüzden hesaplanmış alanların farklı bir şekilde kullanılabileceği bir yöntem arıyorum. JOIN veya SUBQUERY gibi bir yöntem, ya da başka bir şey olmalı.
Yorumları: 10
Konuları: 0
Kayıt Tarihi: 25-01-2024
Aktif Kullandığınız Delphi Sürümü:
Rep Puanı: 57 Başlangıç
Database size ait ise ilgili tablolara tltutar adında bir kolon daha ekleseniz ve insert anında bir trigger yardımı ile doviz cinsi TL dışında olanlar için otomatik hesaplattırıp bu alanı doldursanız nasıl olur.TL ise aynı değeri set edersiniz. Böylelikle view içinde hesaplamaktan kaçmış olursunuz.
Gölge etme başka ihsan istemem.
Yorumları: 843
Konuları: 40
Kayıt Tarihi: 11-11-2016
Aktif Kullandığınız Delphi Sürümü:
Rep Puanı: 4.219 Uzman
23-07-2024, Saat: 16:38
(Son Düzenleme: 23-07-2024, Saat: 16:39, Düzenleyen: hi_selamlar.)
(02-05-2024, Saat: 12:14)nehirnnn Adlı Kullanıcıdan Alıntı: (02-05-2024, Saat: 09:57)hi_selamlar Adlı Kullanıcıdan Alıntı: Merhabalar,
3 tablo veya daha fazla fark etmez. Neden özellikle view kullanmak zorundasınız?
Tüm kodları SQL formatlayarak paylaşırmısınız.
Kolay gelsin.
Merhaba. Bana lazım olan birleştirmeleri View olarak kullandığımda bir çok sayfadan bu view e sanki bir tabloymuş gibi, yeniden SQL ler yazmadan ulaşabiliyorum. Pratikliği açısından. Normalde kullandığım diğer view ler hızlı çalışıyor. Ama kayıt sayısı arttığında, hesaplanmış alanlar çok olduğunda ve UNION kullandığımda performans düşüyor.
Kodlar bu şekilde:
(SELECT
`i`.`id` AS `id`,
0 AS `tur`,
`i`.`tarih` AS `tarih`,
`i`.`hkid` AS `hkid`,
`i`.`did` AS `did`,
`i`.`tbid` AS `tbid`,
`i`.`abid` AS `abid`,
`i`.`hid` AS `hid`,
`i`.`islem_sayisi` AS `islem_sayisi`,
(SELECT
`tnm_islemler_detay`.`hasta_tipi`
FROM `tnm_islemler_detay`
WHERE (`tnm_islemler_detay`.`id` = `i`.`islem_detay`)) AS `hastaTipi`,
(SELECT
`tnm_islemler`.`islem_adi`
FROM `tnm_islemler`
WHERE (`tnm_islemler`.`id` = `i`.`islem`)) AS `islemUrunAdi`,
`i`.`odeme_sekli` AS `odeme_sekli`,
`i`.`r_firma` AS `r_firma`,
IF((`i`.`para_birimi` = 1), (`i`.`fiyat` - `i`.`indirim`), IF((`i`.`para_birimi` = 2), ((`i`.`fiyat` - `i`.`indirim`) * `i`.`euro`), IF((`i`.`para_birimi` = 3), ((`i`.`fiyat` - `i`.`indirim`) * `i`.`dolar`), IF((`i`.`para_birimi` = 4), ((`i`.`fiyat` - `i`.`indirim`) * `i`.`sterlin`), 0)))) AS `tahsilatIslem`,
0 AS `islemUrun`,
0 AS `tahsilatUrun`,
(`i`.`sgk_odeme` * `i`.`islem_sayisi`) AS `sgkOdeme`,
((SELECT
`tahsilatIslem`) * `i`.`islem_sayisi`) AS `tahsilat`,
(((SELECT
`tahsilat`) - ((SELECT
`tahsilat`) / (1 + (`i`.`kdv` / 100)))) * `i`.`islem_sayisi`) AS `kesintiKdv`,
(`i`.`sgk_kesinti` * `i`.`islem_sayisi`) AS `sgkKesinti`,
((((SELECT
`tahsilat`) * `i`.`rf_kom_oran`) / 100) + `i`.`rf_ucret`) AS `rfKomisyon`,
(((((SELECT
`tahsilatIslem`) - (SELECT
`kesintiKdv`)) * `i`.`amortisman`) / 100) * `i`.`islem_sayisi`) AS `amortisman1`,
((SELECT
`tahsilat`) + (SELECT
`sgkOdeme`)) AS `hakedisGelirIslem`,
0 AS `stokGider`,
0 AS `digerGelir`,
0 AS `digerGider`,
((((((SELECT
`sgkKesinti`) + (SELECT
`kesintiKdv`)) + (SELECT
`amortisman1`)) + (SELECT
`stokGider`)) + (((SELECT
`tahsilat`) * `i`.`komisyon`) / 100)) + (SELECT
`rfKomisyon`)) AS `giderToplam`,
((((SELECT
`hakedisGelirIslem`) - (SELECT
`giderToplam`)) * `i`.`hakedis_islem`) / 100) AS `hakedisIslem`,
0 AS `hakedisUrun`,
((SELECT
`hakedisIslem`) + ((`i`.`ref_ucret` * `i`.`hakedis_islem`) / 100)) AS `hakedis`,
`i`.`para_birimi` AS `para_birimi`,
`i`.`kasa` AS `kasa`,
`i`.`aciklama` AS `aciklama`
FROM `islemler` `i`)
UNION ALL
(SELECT
`sh`.`id` AS `id`,
1 AS `tur`,
`sh`.`tarih` AS `tarih`,
`sh`.`hkid` AS `hkid`,
`sh`.`did` AS `did`,
`sh`.`tbid` AS `tbid`,
`sh`.`abid` AS `abid`,
`sh`.`hid` AS `hid`,
1 AS `islem_sayisi`,
`sh`.`hasta_tipi` AS `hastaTipi`,
(SELECT
`stok`.`stok_adi`
FROM `stok`
WHERE (`stok`.`id` = `sh`.`sid`)) AS `islemUrunAdi`,
`sh`.`odeme_sekli` AS `odeme_sekli`,
`sh`.`r_firma` AS `r_firma`,
0 AS `tahsilatIslem`,
IF(((`sh`.`para_birimi` = 1) AND (`sh`.`hareket_turu` = 0)), (`sh`.`alis_fiyati` * `sh`.`miktar`), IF(((`sh`.`para_birimi` = 2) AND (`sh`.`hareket_turu` = 0)), ((`sh`.`alis_fiyati` * `sh`.`miktar`) * `sh`.`euro`), IF(((`sh`.`para_birimi` = 3) AND (`sh`.`hareket_turu` = 0)), ((`sh`.`alis_fiyati` * `sh`.`miktar`) * `sh`.`dolar`), IF(((`sh`.`para_birimi` = 4) AND (`sh`.`hareket_turu` = 0)), ((`sh`.`alis_fiyati` * `sh`.`miktar`) * `sh`.`sterlin`), 0)))) AS `islemUrun`,
IF(((`sh`.`para_birimi` = 1) AND (`sh`.`hareket_turu` = 1)), ((`sh`.`satis_fiyati` * `sh`.`miktar`) - `sh`.`indirim`), IF(((`sh`.`para_birimi` = 2) AND (`sh`.`hareket_turu` = 1)), (((`sh`.`satis_fiyati` * `sh`.`miktar`) - `sh`.`indirim`) * `sh`.`euro`), IF(((`sh`.`para_birimi` = 3) AND (`sh`.`hareket_turu` = 1)), (((`sh`.`satis_fiyati` * `sh`.`miktar`) - `sh`.`indirim`) * `sh`.`dolar`), IF(((`sh`.`para_birimi` = 4) AND (`sh`.`hareket_turu` = 1)), (((`sh`.`satis_fiyati` * `sh`.`miktar`) - `sh`.`indirim`) * `sh`.`sterlin`), 0)))) AS `tahsilatUrun`,
0 AS `sgkOdeme`,
(SELECT
`tahsilatUrun`) AS `tahsilat`,
((SELECT
`tahsilat`) - ((SELECT
`tahsilat`) / (1 + (`sh`.`kdv_orani` / 100)))) AS `kesintiKdv`,
0 AS `sgkKesinti`,
0 AS `rfKomisyon`,
0 AS `amortisman1`,
0 AS `hakedisGelirIslem`,
IF(((`sh`.`hareket_turu` = 0) AND (`sh`.`hakedis` = 1)), (`sh`.`miktar` * `sh`.`alis_fiyati`), 0) AS `stokGider`,
0 AS `digerGelir`,
0 AS `digerGider`,
(((SELECT
`stokGider`) + (((SELECT
`tahsilat`) * `sh`.`komisyon`) / 100)) + (SELECT
`kesintiKdv`)) AS `giderToplam`,
0 AS `hakedisIslem`,
IF((`sh`.`hareket_turu` = 0), ((((SELECT
`tahsilatUrun`) - (SELECT
`giderToplam`)) * (SELECT
`ttb`.`hakedis_islem`
FROM `tnm_temel_birimler` `ttb`
WHERE (`ttb`.`id` = `sh`.`tbid`))) / 100), IF((`sh`.`hareket_turu` = 1), ((((SELECT
`tahsilatUrun`) - (SELECT
`giderToplam`)) * `sh`.`hakedis_urun`) / 100), 0)) AS `hakedisUrun`,
(SELECT
`hakedisUrun`) AS `hakedis`,
`sh`.`para_birimi` AS `para_birimi`,
`sh`.`kasa` AS `kasa`,
IF((`sh`.`hareket_turu` = 0), 'İşlem Ürünü', 'Ürün Satışı') AS `aciklama`
FROM `stok_hareket` `sh`
WHERE (`sh`.`hid` > 0))
UNION ALL
(SELECT
`gg`.`id` AS `id`,
2 AS `tur`,
`gg`.`hakedis_tarih` AS `tarih`,
0 AS `hkid`,
`gg`.`departman` AS `did`,
`gg`.`temel_birim` AS `tbid`,
NULL AS `abid`,
NULL AS `hid`,
1 AS `islem_sayisi`,
NULL AS `hastaTipi`,
NULL AS `islemUrunAdi`,
`gg`.`odeme_sekli` AS `odeme_sekli`,
NULL AS `r_firma`,
0 AS `tahsilatIslem`,
0 AS `islemUrun`,
0 AS `tahsilatUrun`,
0 AS `sgkOdeme`,
0 AS `tahsilat`,
0 AS `kesintiKdv`,
0 AS `sgkKesinti`,
0 AS `rfKomisyon`,
0 AS `amortisman1`,
0 AS `hakedisGelirIslem`,
0 AS `stokGider`,
`gg`.`gelir` AS `digerGelir`,
`gg`.`gider` AS `digerGider`,
(SELECT
`digerGider`) AS `giderToplam`,
0 AS `hakedisIslem`,
0 AS `hakedisUrun`,
((SELECT
`digerGelir`) - (SELECT
`giderToplam`)) AS `hakedis`,
`gg`.`para_birimi` AS `para_birimi`,
`gg`.`kasa` AS `kasa`,
`gg`.`aciklama` AS `aciklama`
FROM `gelir_gider` `gg`
WHERE (`gg`.`temel_birim` > 0))
Merhaba,
WITH tahsilatIslem AS (
SELECT
id,
CASE
WHEN para_birimi = 1 THEN (fiyat - indirim)
WHEN para_birimi = 2 THEN (fiyat - indirim) * euro
WHEN para_birimi = 3 THEN (fiyat - indirim) * dolar
WHEN para_birimi = 4 THEN (fiyat - indirim) * sterlin
ELSE 0
END AS tahsilatIslem
FROM islemler
),
islemHesaplamalar AS (
SELECT
i.id,
ti.tahsilatIslem,
ti.tahsilatIslem * i.islem_sayisi AS tahsilat,
(ti.tahsilatIslem * i.islem_sayisi) - ((ti.tahsilatIslem * i.islem_sayisi) / (1 + (i.kdv / 100))) AS kesintiKdv,
i.sgk_odeme * i.islem_sayisi AS sgkOdeme,
i.sgk_kesinti * i.islem_sayisi AS sgkKesinti,
(((ti.tahsilatIslem * i.islem_sayisi) * i.rf_kom_oran) / 100) + i.rf_ucret AS rfKomisyon,
(((ti.tahsilatIslem - ((ti.tahsilatIslem * i.islem_sayisi) - ((ti.tahsilatIslem * i.islem_sayisi) / (1 + (i.kdv / 100))))) * i.amortisman) / 100) * i.islem_sayisi AS amortisman1,
(ti.tahsilatIslem * i.islem_sayisi) + (i.sgk_odeme * i.islem_sayisi) AS hakedisGelirIslem
FROM
islemler i
JOIN tahsilatIslem ti ON i.id = ti.id
)
gibi bir yapı üzerinden deneyin isterseniz.
Tabi bu yapı MySQL eski sürümlerinde desteklemez.
Kolay gelsin.
Amaç, bilginin de/aklın da zekat'ını vermek.
Yorumları: 186
Konuları: 41
Kayıt Tarihi: 19-10-2017
Aktif Kullandığınız Delphi Sürümü:
Rep Puanı: 236 Acemi
Teşekkürler... Ama hosting engeli çıktı bu yöntemde de. Mysql versiyonu 5.7 görünüyor. O da WITH komutunu desteklemiyor.
|