Konuyu Oyla:
  • Derecelendirme: 0/5 - 0 oy
  • 1
  • 2
  • 3
  • 4
  • 5
Hesaplanmış Alanların Tekrar Kullanılması
#11
(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.
Cevapla
#12
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 Smile
WWW
Cevapla
#13
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ı.
Cevapla
#14
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.
Cevapla
#15
(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.
Cevapla
#16
Teşekkürler... Ama hosting engeli çıktı bu yöntemde de. Mysql versiyonu 5.7 görünüyor. O da WITH komutunu desteklemiyor.
Cevapla


Konu ile Alakalı Benzer Konular
Konular Yazar Yorumlar Okunma Son Yorum
  Double Alanların sayıları değişmiş. delphicim 0 780 19-12-2020, Saat: 01:12
Son Yorum: delphicim
  MariaDB Hesaplanmış alan SercanTEK 6 5.093 28-04-2020, Saat: 01:18
Son Yorum: hi_selamlar



Konuyu Okuyanlar: 1 Ziyaretçi