Duyuruyu Kapat
Facebook Gözat
Twitter Gözat

Bankadan geçmesi gerekenleri SQL ile yakalamak...

Konu, 'SQL' kısmında tahirsalt tarafından paylaşıldı.

  1. tahirsalt

    tahirsalt Yeni Üye

    Kayıt:
    14 Mayıs 2017
    Mesajlar:
    9
    Beğenilen Mesajlar:
    1
    Şehir:
    İstanbul
    Selamlar Arkadaşlar,

    HSPKOD Fisno aciklama Borc Alacak
    600.10 1 A Ltd. 6500
    391.10 1 A Ltd. 1000
    100.10 1 A Ltd. 7500

    600.10 1 A Ltd. 6500
    391.10 1 A Ltd. 1000
    120.10 1 A Ltd. 7500

    600.10 2 B Ltd. 6700
    391.10 2 B Ltd. 1200
    100.10 2 B Ltd. 7900

    Önce derdimi muhasebe diliyle anlatayım: genel muhasebeyi bilenler bilir. Bankadan geçmesi gereken devletin açıkladığı "7000" TL sınırını aşan işlemleri yakalamaya çalışıyorum. Elimde üstteki gibi örnek bir tablo var.

    Bu tabloda bankadan geçmesi gerekirken kasadan ödenmiş 2 fatura görüyorum. A Ltd. ve B Ltd. yapılan satışlardan "100.10" kapatılmış iki kayıt vergi cezası gerektiriyor. (Cezası Kanuna göre 2 x 1300= 2600 TL) Şimdi binlerce kayıt içinden bu kayıtları SQL sorgusu ile yakalamak istiyorum.

    Şimdide yazılımcı arkadaşların diliyle yazmaya çalışayım: "Borc">7000 büyük olan "HSPKOD" 100% başlayalar ile "Alacak">6000 büyük olan "HSPKOD" 600% ile başlayalardan "Fisno" ve "aciklama" ları aynı olanların listelenmesini istiyorum.

    Aşağıdaki gibi bu şartlara uyan HSPKOD "100%" olanlar listelense yeterli veya bunu yakalayabilecek bir sonuç...

    HSPKOD Fisno aciklama Borc
    100.10 1 A Ltd. 7500
    100.10 2 B Ltd. 7900

    2 günlük araştırma sonucunda üstteki sonuca yaklaşabilmiş değilim. [​IMG]


    create table table1 (HSPKOD varchar(30), Fisno int, aciklama varchar(30), Borc varchar(30), Alacak varchar(30))
    INSERT INTO table1 (HSPKOD, Fisno, aciklama, Borc, Alacak)
    values
    (600.10,1,'A Ltd.',Null,6500),
    (391.10,1,'A Ltd.',Null,1000),
    (100.10,1,'A Ltd.',7500,Null),

    (600.10,1,'A Ltd.',Null,6500),
    (391.10,1,'A Ltd.',Null,1000),
    (120.10,1,'A Ltd.',7500,Null),

    (600.10,2,'B Ltd.',Null,6700),
    (391.10,2,'B Ltd.',Null,1200),
    (100.10,2,'B Ltd.',7900,Null);



    GROUP BY HAVING COUNT(*)>1 ile ilgili birşeyler buldum ama onuda başaramadım [​IMG]

    Select Fisno, aciklama, COUNT(*) from table1
    where (HSPKOD LIKE '1%' and Borc >7000) or
    (HSPKOD LIKE '6%' and Alacak >6000)
    GROUP BY Fisno, aciklama having COUNT(*) > 1
     
  2. sedirAğacı

    sedirAğacı Daimi Üye

    Kayıt:
    2 Mart 2016
    Mesajlar:
    897
    Beğenilen Mesajlar:
    237
    Meslek:
    Bilgisayar programcısı.
    Şehir:
    Aydın
    Yazdığım kodlar MSSQL için ama diğer veri tabanlarındada basit bi kaç değişiklikle kullanılır.

    SELECT * FROM table1 WHERE (HSPKOD LIKE '100%' AND Borc > 7000)
    OR (HSPKOD LIKE '600%' AND Alacak > 6000)
    ORDER BY HSPKOD

    order by sıralamak için. Yazmazsan karışık gelir. Aslında key alanına göre gelir.
    Açıklamalarına göre sıralama istersen, yine order by yanına ekleyebilirsin.
    ORDER BY HSPKOD, aciklama

    count() kayıt sayısını saymak için kullanılır. GROUP BY da gruplamak için. Ancak bu ikisine ihtiyacın yok gibi görünüyor.
     
    tahirsalt bunu beğendi.
  3. tahirsalt

    tahirsalt Yeni Üye

    Kayıt:
    14 Mayıs 2017
    Mesajlar:
    9
    Beğenilen Mesajlar:
    1
    Şehir:
    İstanbul
    Cevabınız için çok teşekkür ederim. Sonuca yaklaşıyoruz. Bir arkadaşımız şöyle bir kod gönderdi ancak onunda eksiği çok:
    select * from table1 where ((Borc>7000 and HSPKOD like '100%') or (Alacak>6000 and HSPKOD like '600%')) and HSPKOD like '100%'

    Konunun daha iyi anlaşılabilmesi için örneği genişlettim.

    create table table1 (HSPKOD varchar(30), Fisno int, aciklama varchar(30), Borc varchar(30), Alacak varchar(30))
    INSERT INTO table1 (HSPKOD, Fisno, aciklama, Borc, Alacak)
    values
    (600.10,1,'A Ltd.',Null,6500),
    (391.10,1,'A Ltd.',Null,1000),
    (100.10,8,'A Ltd.',7500,Null), --Bu satır gelmemesi gerekir. Çünkü 600% Fisno ile 100% fisno aynı değil.

    (600.10,2,'D Ltd.',Null,6999),
    (391.10,2,'D Ltd.',Null,1000),
    (120.10,2,'D Ltd.',7999,Null), --Bu satırda gelmemesi gerekir. Çünkü içinde "100%" ile başlayan satır yok

    (254.10,3,'B Ltd.',Null,6700),
    (391.10,3,'B Ltd.',Null,1200),
    (100.10,3,'B Ltd.',7900,Null), --Bu satırda gelmemesi gerekir. "100%" var ancak "600%" ile başlayan yok.

    (600.10,4,'B Ltd.',Null,6700),
    (391.10,4,'B Ltd.',Null,1200),
    (100.10,4,'Toplu Tahsilatlar',7900,Null), --Bu satırda gelmemesi gerekir."100%" ile başlayanın açıklaması "600%" ile başlayanın açıklamasına eşit değil.

    (600.10,5,'B Ltd.',Null,6700),
    (391.10,5,'B Ltd.',Null,1200),
    (100.10,5,'B Ltd.',7900,Null); -- Sadece bu satır gelecek; "600%" ile başlayan kayıt var ve "alacak" rakamı "6000" den büyük, 100% ve 600% ün "Açıklama" ve "fis no"ları aynı. "100%" "Borc" rakamı 7000'den büyük.

    İstediğimiz sonuç sadece tek satır gelmeli veya en azından bana 'fisno' sunu sonuç döndürsün ki gidip fişe bakıp yakalayayım.
    (100.10,5,'B Ltd.',7900,Null);


    Çok teşekkür ederim...
     
  4. sedirAğacı

    sedirAğacı Daimi Üye

    Kayıt:
    2 Mart 2016
    Mesajlar:
    897
    Beğenilen Mesajlar:
    237
    Meslek:
    Bilgisayar programcısı.
    Şehir:
    Aydın
    Durum değişti. o_O
    Kolay yolu yazayım. Aynı tabloyu 2 farklı tabloymuş gibi kullanacağız. Tablo adı aynı olduğu için, ismin yanına A ve B kodu ile belirteç koyacağız.

    SELECT Fisno FROM table1 A WHERE A.HSPKOD LIKE '100%' AND A.Borc > 7000
    AND EXISTS
    (SELECT Fisno FROM table1 B WHERE A.Fisno = B.Fisno AND A.aciklama=B.aciklama AND B.HSPKOD LIKE '600%' AND B.Alacak > 6000)

    GROUP BY ve HAVINGlede uğraşılsa yapılır ancak o komutlarda arka planda bu işlemi yapacak.
    Aslında bu sorgu GROUP BY lı olandan çok daha hızlı çalışır. Direk hedef kayda yöneliyor. GROUP BY'lı olan ise önce tüm tabloyu gerekmediği halde grupluyor, sonra hedefe yöneliyor.


    Tabi bu tür sorgu, sistemi çok meşgul eder. Kayıt sayısı milyonlarla ifade ediliyorsa, bu sorguyu mesai saati dışında çalıştırmanızı tavsiye ederim.:)
     
    Son düzenleme: 15 Mayıs 2017
    tahirsalt bunu beğendi.
  5. tahirsalt

    tahirsalt Yeni Üye

    Kayıt:
    14 Mayıs 2017
    Mesajlar:
    9
    Beğenilen Mesajlar:
    1
    Şehir:
    İstanbul
    Dünyada halen yardım sever insanların olması umut verici. Çok teşekkür ederim. Çok işime yaradı.:)
     
    sedirAğacı bunu beğendi.