WHERE Funktion

Installation und Anwendung von Datenbankschnittstellen wie SQLite, PostgreSQL, MariaDB/MySQL, der DB-API 2.0 und sonstigen Datenbanksystemen.
Antworten
chicago
User
Beiträge: 3
Registriert: Mittwoch 5. Februar 2020, 09:56

Hallo, von einer bestimmten Person in der Datenbank will ich die Steuer berechnen lassen.
Kann mir jemand sagen, wie ich das konstruiere?


import sqlite3

# Verbindung, Cursor
connection = sqlite3.connect("BB.db")
cursor = connection.cursor()

# SQL-Abfrage
sql = "SELECT * FROM firmen"

# Kontrollausgabe der SQL-Abfrage
# print(sql)

# Absenden der SQL-Abfrage
# Empfang des Ergebnisses
ergebnis = cursor.execute("select SUM(gewinn) from firmen").fetchall()
print ( ergebnis )

ergebnis = cursor.execute("select SUM(gewinn)/1.19 from firmen").fetchall()
print ( ergebnis )

# Verbindung beenden
connection.close()
Benutzeravatar
sparrow
User
Beiträge: 4527
Registriert: Freitag 17. April 2009, 10:28

Zuerst solltest du deinen Code hier immer in Code-Tags packen (werden eingefügt, wenn man im vollständigen Editor den </> Button drückt.

Bisher bekommst du die Summe des Feldes "gewinn". Möchtest du das auf einzelne Datensätze einschränken, musst du - wie du bereits im Threadtitel festgestellt hast, WHERE benutzen.
Ohne die Felder deiner Relation zu kennen, kann man leider nicht mehr als diese pauschale Aussage treffen.
Benutzeravatar
__blackjack__
User
Beiträge: 14002
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@chicago: Weitere Anmerkungen zum Quelltext: Die Kommentare sind allesamt überflüssig. Faustregel: Nicht kommentieren *was* der Code macht, denn das steht da bereits als Code, sondern warum der das so macht. Sofern das nicht offensichtlich ist.

Bei den `print()`-Aufrufen hast Du es mit den Leerzeichen etwas übertrieben. Zwischen Funktionsname und Klammern kommt keines und auch innerhalb der Klammern setzt man die nicht von den Argumenten ab.

`sqlite3`-Verbindungsobjekte sind Kontextmanager, das sollte man ausnutzen, statt die Verbindung am Ende durch ein `close()` selbst zu schliessen.

`sql` wird definiert, aber nirgends verwendet. Das kann weg. Ein Sternchen sollte man beim SELECT nicht benutzen, weil man dann im Programm nicht ablesen kann was da eigentlich selektiert wird, und das Programm ist dann nicht robust gegen Schemaänderungen.

Bei Aggregatfunktionen kommt ja nur ein Ergebnis, da macht `fetchall()` wenig Sinn.

Zwischenstand:

Code: Alles auswählen

#!/usr/bin/env python3
import sqlite3


def main():
    with sqlite3.connect("BB.db") as connection:
        cursor = connection.cursor()

        ergebnis = cursor.execute("SELECT SUM(gewinn) FROM firmen").fetchone()
        print(ergebnis)

        ergebnis = cursor.execute(
            "SELECT SUM(gewinn)/1.19 FROM firmen"
        ).fetchone()
        print(ergebnis)


if __name__ == "__main__":
    main()
“The best book on programming for the layman is »Alice in Wonderland«; but that's because it's the best book on anything for the layman.” — Alan J. Perlis
chicago
User
Beiträge: 3
Registriert: Mittwoch 5. Februar 2020, 09:56

Ich suche einen WHERE cod mit dem ich auf einen Datensatz (select) zugreife und damit eine Prozentrechnung ausführe.
Sirius3
User
Beiträge: 18252
Registriert: Sonntag 21. Oktober 2012, 17:20

Wo ist denn das Problem? Wir kennen Dein Datenbankschema nicht, können daher auch keine Hilfe geben. Was hast Du schon versucht? WHERE wird in jedem Tutorial zu SQL erklärt. Was genau verstehst Du daran nicht?
Benutzeravatar
__blackjack__
User
Beiträge: 14002
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

Ich mag ja SQLAlchemy ganz gerne als Abstraktionsschicht bei SQL-Datenbanken. 😎

Code: Alles auswählen

#!/usr/bin/env python3
from decimal import Decimal

from sqlalchemy import create_engine, MetaData, select


def main():
    engine = create_engine("sqlite:///BB.db")
    metadata = MetaData(engine)
    metadata.reflect()
    firma_table = metadata.tables["firmen"]

    gewinn = (
        select([firma_table.c.gewinn], firma_table.c.id == 42)
        .execute()
        .scalar()
    )
    if gewinn is not None:
        print("Gewinn =", (gewinn * Decimal("1.19")).quantize(Decimal("1.00")))
    else:
        print("Diese Firma existiert nicht.")


if __name__ == "__main__":
    main()
“The best book on programming for the layman is »Alice in Wonderland«; but that's because it's the best book on anything for the layman.” — Alan J. Perlis
Antworten