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
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.