Python - Sqlite3'den Özet Veriler Çekmek

Merhaba,

sqlite3 de aşağıdaki gibi oluşturulmuş tablom var;

self.cursor.execute(
            "CREATE TABLE IF NOT EXISTS GELIR (TARIH TEXT, TUR TEXT, ACIKLAMA TEXT, TUTAR FLOAT, ISLEM INT, KAYIT_TARIHI TEXT)")

programda bu tablodaki veriler ile ilgili rapor alırken türüne göre ayırmak ve türüne göre alt toplam almak istiyorum.

Farzı misal tabloda 10 kayıt olsun. Bu kayıtlardan;

5 tanesinin türü “MAAŞ”
3 tanesinin türü “KİRA”
2 tanesinin türü “MUHTELİF” olsun.

yazacağım kod ile tür kısmında bulunan aynı türden kayıtların toplamını versin istiyorum.

Kendim çok karmaşık ve sağlıklı bir şekilde çalışmayan bir algoritma kurdum ama bahsettiğim şekilde bir sonuç oluşturmadı.

Yardımcı olabilecek varsa teşekkür ederim.

Not >> Tablodaki tür kısmı kullanıcı tarafından elle dolduruluyor. Belirli seçimler olmadığı için çok sayıda tür değişkeni mevcut olabilir.

Merhaba,

WHERE ifadesini kullanarak TUR sütunu değeri MAAŞ olanları şöyle alabilirsiniz diye tahmin ediyorum.

def make_query(select, table, where, value):
    return cursor.execute(
        f"SELECT {select} FROM {table} WHERE {where} = ?", 
        (value, )
    )
    
print(sum(i[0] for i in make_query("TUTAR", "GELIR", "TUR", "MAAŞ")))
2 Beğeni

SQL Group By komutu kullanarak belirli bir kolonu gruplayıp işlem yapabilirsiniz. Toplama için SUM, kaç adet olduğunu saymak için COUNT kullanabilirsiniz.

import sqlite3

vt = sqlite3.connect("veritabani.db")
cursor = vt.cursor()

cursor.execute("""
SELECT TUR,COUNT(TUR),SUM(TUTAR) FROM GELIR GROUP BY TUR
""")
veriler = cursor.fetchall()

for tur_adi,adet,toplam in veriler:
    print("{0} adet {1} için toplam: {2}".format(adet,tur_adi,toplam))

Bendeki örnek veritabanı için çıktı:

1 adet KIRA için toplam: 200.0
2 adet MAAS için toplam: 1200.0
1 adet MUHTELIF için toplam: 800.0
2 Beğeni

Teşekkür ederim fakat tür kısmı (TUR) kullanıcı tarafından elle yazılan bir değer alanı olduğu için belli başlı şeylerden oluşmuyor. (Bu detayı vermeyi unuttuğum için kusura bakmayın.) Bundan sebep bu kodun bu programda işimi göremeyecek.

Teşekkür ederim. Kodu denedim fakat çalıştırdığım zaman bir sıkıntı var. Program GELIR adındaki tabloyu bulamıyor ve no such table hatasını veriyor.

Bilginiz dahilinde bir durum mu?

Doğru veritabanı adı yazdığınızdan ve GELIR isimli tablonun var olduğundan emin misiniz? Ben önce veritabanını ve sizin yukarıda verdiğiniz SQL kodu ile tabloyu oluşturup birkaç veri ekledikten sonra çalıştırdım bu kodu.

Neyden oluşuyor peki? TUR kısmı neden elle yazılan bir alan ki? Bir Combobox’ın elemanı olabilir aslında.

Evet çok doğru fakat üzerine konuştuğumuz kod’un çalıştığı program konsol üzerinden çalışıyor. maalesef ki pencereli değil :frowning:

Tekrar tekrar kontrol ediyorum ama doğru. Hata yok gözüküyor. Hala bakıyorum @coderistan

O zaman tablo adını tekrar kontrol edin. Belki sizin veritabanınızda GELİR veya gelir şeklinde farklı kaydedilmiştir bilemedim. Ben GELIR olduğunu varsayarak yazdım kodu.

tabloyu oluşturduğum kod;

self.cursor.execute(
            "CREATE TABLE IF NOT EXISTS GELIR (TARIH TEXT, TUR TEXT, ACIKLAMA TEXT, TUTAR FLOAT, ISLEM INT, KAYIT_TARIHI TEXT)")

veriyi çekmeye çalıştığım kod;

self.cursor.execute("SELECT TUR,COUNT(TUR),SUM(TUTAR) FROM GELIR GROUP BY TUR")

bir de siz bakın yanlış mı yazıyorum

Yanlış yapmıyorsunuz gibi görünüyor. Şu kodu bir boş dosyaya kaydedip çalıştırın bakalım çalışıyor mu? Belki hatanızı da görürsünüz kendi kodunuzla karşılaştırarak

import sqlite3

vt = sqlite3.connect("coderistan.db")
cursor = vt.cursor()

cursor.execute("""
CREATE TABLE IF NOT EXISTS GELIR (TARIH TEXT, TUR TEXT, ACIKLAMA TEXT, TUTAR FLOAT, ISLEM INT, KAYIT_TARIHI TEXT)
""")
vt.commit()

cursor.execute("""
INSERT INTO `GELIR` (TARIH,TUR,ACIKLAMA,TUTAR,ISLEM,KAYIT_TARIHI) VALUES 
('27.12.2020','MAAS','bir',500.0,'maas','27.12.2020'),
('27.12.2020','MAAS','iki',700.0,'maas','27.12.2020'),
('27.12.2020','KIRA','uc',200.0,'kira','27.12.2020'),
('27.12.2020','MUHTELIF','dort',800.0,'muhtelif','27.12.2020');
""")
vt.commit()


cursor.execute("""
SELECT TUR,COUNT(TUR),SUM(TUTAR) FROM GELIR GROUP BY TUR
""")
veriler = cursor.fetchall()

for tur_adi,adet,toplam in veriler:
    print("{0} adet {1} için toplam: {2}".format(adet,tur_adi,toplam))
vt.close()
1 Beğeni

Tamamdır no such table hatası çözüldü. Ufak bir yazım yanlışından mütevellit.

Çözüm olarak işaretlediğim yanıtta işimi gördüm çok sağol @coderistan

1 Beğeni

Ben de, @coderistan’ın çözümünün biraz daha pratik halini eklemek istiyorum. Şu SQL kodu ile, veritabanında (aynı tablo oluşturur gibi) bir “görünüm (view)” oluşturabilirsiniz.

CREATE VIEW "OZET" AS SELECT TUR,COUNT(TUR),SUM(TUTAR) FROM GELIR GROUP BY TUR

(Bu, tek seferlik bir işlem.)

Böylece direkt,

SELECT * FROM "OZET"

komutu ile istediğiniz, özet veriyi çekebilirsiniz.

2 Beğeni

Bu da güzelmiş. Akşam deneyeceğim. Teşekkür ederim.