List doppelte einträge addieren

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
AstroCom
User
Beiträge: 8
Registriert: Sonntag 22. November 2020, 21:12

Hallo zusammen,

schon vorab blutiger Anfänger. Ich zapfe meine GnuCash DB mit Python die Daten ab mit speichere diese in eine List ab

Code: Alles auswählen

umsaetze = sqlcursor.fetchall()
umsaetze = [list(row) for row in umsaetze]
ein print ergibt jetzt folgendes raus:

Code: Alles auswählen

[datetime.datetime(2020, 11, 21, 13, 1, 32), datetime.datetime(2020, 11, 20, 10, 59), 'Geschenkgutschein', 2500, 100]
[datetime.datetime(2020, 11, 21, 13, 1, 2), datetime.datetime(2020, 11, 20, 10, 59), 'Lebensmittel', 828, 100]
[datetime.datetime(2020, 11, 21, 13, 0, 43), datetime.datetime(2020, 11, 20, 10, 59), 'Essen', 1739, 100]
[datetime.datetime(2020, 11, 21, 13, 0, 38), datetime.datetime(2020, 11, 20, 10, 59), 'Essen', 340, 100]
[datetime.datetime(2020, 11, 21, 13, 0, 27), datetime.datetime(2020, 11, 19, 10, 59), 'Bremsscheiben', 795, 100]
[datetime.datetime(2020, 11, 21, 13, 0, 3), datetime.datetime(2020, 11, 19, 10, 59), 'Aufw. Handelsware, Schnellverschluss für Fahrrad', 486, 100]
[datetime.datetime(2020, 11, 21, 12, 58, 47), datetime.datetime(2020, 11, 18, 10, 59), 'Essen', 1314, 100]
[datetime.datetime(2020, 11, 21, 12, 58, 29), datetime.datetime(2020, 11, 18, 10, 59), 'Essen', 240, 100]
[datetime.datetime(2020, 11, 21, 12, 58, 15), datetime.datetime(2020, 11, 18, 10, 59), 'von KK über P2 zu P1', 0, 100]
[datetime.datetime(2020, 11, 21, 12, 58, 15), datetime.datetime(2020, 11, 18, 10, 59), 'von KK über P2 zu P1', 48928, 100]
[datetime.datetime(2020, 11, 21, 12, 57, 33), datetime.datetime(2020, 11, 18, 10, 59), 'von KK über P1 zu P2', 49254, 100]
[datetime.datetime(2020, 11, 21, 12, 57, 33), datetime.datetime(2020, 11, 18, 10, 59), 'von KK über P1 zu P2', 0, 100]
[datetime.datetime(2020, 11, 21, 12, 56, 54), datetime.datetime(2020, 11, 17, 10, 59), 'Essen', 1415, 100]
[datetime.datetime(2020, 11, 21, 12, 56, 26), datetime.datetime(2020, 11, 17, 10, 59), 'Fahrrad Reperatur Laufrad Hinten', 5699, 100]
[datetime.datetime(2020, 11, 21, 12, 55, 47), datetime.datetime(2020, 11, 17, 10, 59), 'Fahrradabholung Fahrkarte', 500, 100]
[datetime.datetime(2020, 11, 21, 12, 55, 15), datetime.datetime(2020, 11, 16, 10, 59), 'Modelbahn Folieren der Kurve', 1155, 100]
[datetime.datetime(2020, 11, 21, 12, 54, 35), datetime.datetime(2020, 11, 16, 10, 59), 'Essen', 587, 100]
[datetime.datetime(2020, 11, 21, 12, 54, 26), datetime.datetime(2020, 11, 13, 10, 59), 'Essen', 874, 100]
[datetime.datetime(2020, 11, 21, 12, 54, 19), datetime.datetime(2020, 11, 12, 10, 59), 'Fahrrad Ersatzteile', 770, 100]
[datetime.datetime(2020, 11, 21, 12, 53, 52), datetime.datetime(2020, 11, 11, 10, 59), 'LED Leiste für Modelbahn', 3624, 100]
[datetime.datetime(2020, 11, 21, 12, 53, 29), datetime.datetime(2020, 11, 11, 10, 59), 'Essen', 315, 100]
[datetime.datetime(2020, 11, 21, 12, 53, 23), datetime.datetime(2020, 11, 11, 10, 59), 'Fahrrad Reperatur teile', 990, 100]
[datetime.datetime(2020, 11, 11, 18, 43, 12), datetime.datetime(2020, 11, 10, 10, 59), 'Essen', 658, 100]
############################
[datetime.datetime(2020, 11, 11, 18, 41, 56), datetime.datetime(2020, 11, 10, 10, 59), 'Fahrrad und Essen', 979, 100]
[datetime.datetime(2020, 11, 11, 18, 41, 56), datetime.datetime(2020, 11, 10, 10, 59), 'Fahrrad und Essen', 1000, 100]
############################
[datetime.datetime(2020, 11, 11, 18, 41, 48), datetime.datetime(2020, 11, 9, 10, 59), 'Essen', 341, 100]
[datetime.datetime(2020, 11, 11, 18, 41, 39), datetime.datetime(2020, 11, 9, 10, 59), 'Audible', 995, 100]
[datetime.datetime(2020, 11, 11, 18, 41, 5), datetime.datetime(2020, 11, 9, 10, 59), 'Essen', 244, 100]
[datetime.datetime(2020, 11, 5, 8, 41, 47), datetime.datetime(2020, 11, 4, 10, 59), 'Essen', 689, 100]
[datetime.datetime(2020, 11, 5, 8, 41, 42), datetime.datetime(2020, 11, 4, 10, 59), 'Modelbahn Bretter', 829, 100]
Leider sind einige "Datensätze" doppelt wie hier grau markiert. Diese müssen aber zusammengerechnet werden und als ein Datensatz angezeigt werden. Und müsste so aussehen.

Code: Alles auswählen

[datetime.datetime(2020, 11, 11, 18, 41, 56), datetime.datetime(2020, 11, 10, 10, 59), 'Fahrrad und Essen', 1979, 100]
leider habe ich den ganzen Tag verbraucht diese Problem zu lösen. Ich habe aber einfach keinen Ansatz mehr wie ich dies angreifen sollte. Mein Plan wäre mit

Code: Alles auswählen

for nr, row in enumerate([i[0] for i in umsaetze]):
    templist=[nr, row]
die erste Zahle also ID heraus zu holen. Und dann mit die doppelten Datensätzen anzeigen lassen.
dann ein

Code: Alles auswählen

for row in  umsaetze:
    origdata = row
ausgeben. Und die origdata mit templist addieren. Anschließed in der origdata ersetzen. und die templist löschen.

Wäre das ein Ansatz oder gibt es einen viel simpleren Code das wieder nur 5 Zeilen lang ist? Ich weiß es ist gerade 00:24 an einen Montag
Benutzeravatar
__blackjack__
User
Beiträge: 13241
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@AstroCom: Das könnte man schon bei der SQL-Abfrage lösen.

Wonach wird denn entschieden was ”doppelte Einträge” sind?

Also warum sind die markierten dass, aber

[datetime.datetime(2020, 11, 21, 12, 58, 15), datetime.datetime(2020, 11, 18, 10, 59), 'von KK über P2 zu P1', 0, 100]
[datetime.datetime(2020, 11, 21, 12, 58, 15), datetime.datetime(2020, 11, 18, 10, 59), 'von KK über P2 zu P1', 48928, 100]

oder

[datetime.datetime(2020, 11, 21, 12, 57, 33), datetime.datetime(2020, 11, 18, 10, 59), 'von KK über P1 zu P2', 49254, 100]
[datetime.datetime(2020, 11, 21, 12, 57, 33), datetime.datetime(2020, 11, 18, 10, 59), 'von KK über P1 zu P2', 0, 100]

nicht?

Und ist in dem SQL ein Sortierkriterium angegeben das dem Kriterium der doppelten Einträge entspricht? Falls nicht könnte es ja auch Einträge betreffen die nicht in aufeinander folgenden Zeilen stehen. Falls man keine Sortierung angibt ist das Ergebnis ohne eine garantierte Ordnung. Man darf sich dann nicht darauf verlassen das es scheinbar zufällig schon passend sortiert zu sein scheint.
Please call it what it is: copyright infringement, not piracy. Piracy takes place in international waters, and involves one or more of theft, murder, rape and kidnapping. Making an unauthorized copy of a piece of software is not piracy, it is an infringement of a government-granted monopoly.
AstroCom
User
Beiträge: 8
Registriert: Sonntag 22. November 2020, 21:12

Hallo @__blackjack__

danke für die späte Antwort. Du hast Recht ich habe vergessen wo nach der Rechner die gleichen Einträge suchen soll. Und das wäre in diesen Fall das erste datetime der Spalte. Um deine Frage zu beantworten würde es so aussehen

[datetime.datetime(2020, 11, 21, 12, 57, 33), datetime.datetime(2020, 11, 18, 10, 59), 'von KK über P1 zu P2', 49254, 100]

nicht so:

[datetime.datetime(2020, 11, 21, 12, 57, 33), datetime.datetime(2020, 11, 18, 10, 59), 'von KK über P1 zu P2', 49254, 100]
[datetime.datetime(2020, 11, 21, 12, 57, 33), datetime.datetime(2020, 11, 18, 10, 59), 'von KK über P1 zu P2', 0, 100]

Aber es war tarzählich nicht python sondern SQL der Lösungsweg. Stichwort SUM(), MAX() und GROUP BY. Damit sich jeder ein Bild machen kann hier ist der SQL Code:

Code: Alles auswählen

SELECT tempTabelle1.enter_date, MAX(tempTabelle1.Datum), MAX(description), SUM(tempTabelle1.Euro), MAX(tempTabelle1.quantity_denom) FROM (
    SELECT transactions.guid, transactions.enter_date, transactions.post_date AS "Datum", gnucash.transactions.description, accounts.name AS "gegenBuchungskonto", splits.value_num AS "Euro", splits.quantity_denom FROM gnucash.splits
    INNER JOIN gnucash.transactions ON gnucash.splits.tx_guid = gnucash.transactions.guid
    INNER JOIN gnucash.accounts ON gnucash.splits.account_guid = gnucash.accounts.guid
    WHERE transactions.guid IN (
        SELECT transactions.guid FROM gnucash.splits
        INNER JOIN gnucash.transactions ON gnucash.splits.tx_guid = gnucash.transactions.guid
        INNER JOIN gnucash.accounts ON gnucash.splits.account_guid = gnucash.accounts.guid
        WHERE accounts.name LIKE "Commerzbank Kreditkarte" )
    AND accounts.name NOT LIKE "Commerzbank Kreditkarte"
) AS tempTabelle1
GROUP BY tempTabelle1.enter_date
ORDER BY tempTabelle1.enter_date DESC
LIMIT 30;
Antworten