zunächst habe ich zwei listen mit den absoluten Einwohnerzahlen:
sum_laender
Out[18]: [(64556818,)]
sum_migration
Out[19]: [(80613,)]
wie kann ich die Differenz dieser Listen bilden indem ich eine neue Liste mit eben dieser Differenz schreibe?
SQL Lite Abfrage
@Padidem: Summe ist eine Aggregationsfunktion und solange Du kein GROUP BY hast, liefert Dir das immer nur einen Datensatz. Statt eines fetchall brauchst Du also nur ein fetchone. Dann ist ein Datensatz ein Tuple mit allen Spaltenwerten, auch wenn es nur eine Spalte gibt.
Also statt mit Listen rechnen zu wollen, die logisch nicht existieren und mit Tupeln, deren Summenbildung meist sinnlos ist, solltest Du Dir den Wert, der Dich interessiert aus dieser Struktur herausholen und mit dem dann rechnen.
Oder soll die Rechnung von der Datenbank erledigt werden?
Also statt mit Listen rechnen zu wollen, die logisch nicht existieren und mit Tupeln, deren Summenbildung meist sinnlos ist, solltest Du Dir den Wert, der Dich interessiert aus dieser Struktur herausholen und mit dem dann rechnen.
Oder soll die Rechnung von der Datenbank erledigt werden?
So lautet die Aufgabe:
Produzieren sie eine Abfrage, die folgende Elemente enthält:
- Das Stimmgewicht des jeweiligen Landes;
- Die absolute Differenz der Einwohnerzahl in der Tabelle laender info und der Einwohnerzahl(
gesamt) in der Tabelle migrationshintergrund 2013; Hinweis: SQLite Funktionen
- Prozentualer Anteil der Personen mit Migrationshintergrund an der Gesamtbevölkerung (Tabelle:
migrationshintergrund 2013);
- Eingegrenzt auf diejenigen Läander, die mehr als 200 Einwohner pro km2 aber nicht mehr als 2000
haben;

Produzieren sie eine Abfrage, die folgende Elemente enthält:
- Das Stimmgewicht des jeweiligen Landes;
- Die absolute Differenz der Einwohnerzahl in der Tabelle laender info und der Einwohnerzahl(
gesamt) in der Tabelle migrationshintergrund 2013; Hinweis: SQLite Funktionen
- Prozentualer Anteil der Personen mit Migrationshintergrund an der Gesamtbevölkerung (Tabelle:
migrationshintergrund 2013);
- Eingegrenzt auf diejenigen Läander, die mehr als 200 Einwohner pro km2 aber nicht mehr als 2000
haben;
habe folgende Einzelabfragen erzeugt:
1. Stimmgewicht des jeweiligen Landes:
2. Differenz:
Absolute Differenz: 64556818 – 80613
3. prozentualer Anteil:
4. Eingrenzung:
wie kann ich die Einzelabfragen nun zu einer einzigen (kombinierten) Abfrage zusammenfassen???
1. Stimmgewicht des jeweiligen Landes:
Code: Alles auswählen
cursor.execute('''SELECT stimmgewicht,land FROM laender_info ''').fetchall()
Code: Alles auswählen
cursor.execute('''SELECT sum(insgesamt) FROM migrationshintergrund_2013''').fetchall()
cursor.execute('''SELECT sum (einwohner_km2 * flaeche) FROM laender_info''').fetchall()
3. prozentualer Anteil:
Code: Alles auswählen
cursor.execute('''SELECT sum (insgesamt) FROM migrationshintergrund_2013''').fetchall()
cursor.execute('''SELECT sum (mit_mh) FROM migrationshintergrund_2013''').fetchall()
Code: Alles auswählen
anteil =[float (16538) / 80613]
Code: Alles auswählen
cursor.execute('''SELECT land FROM laender_info WHERE einwohner_km2 BETWEEN 200 AND 2000''').fetchall()
wie kann ich die Einzelabfragen nun zu einer einzigen (kombinierten) Abfrage zusammenfassen???
@ Sirius3: In etwa so:
und wie kann ich mir dann eine Dezimalzahl ausgeben lassen?
Code: Alles auswählen
cursor.execute('''SELECT (sum (mit_mh)) / sum (insgesamt) FROM migrationshintergrund_2013''').fetchall()
- Hyperion
- Moderator
- Beiträge: 7478
- Registriert: Freitag 4. August 2006, 14:56
- Wohnort: Hamburg
- Kontaktdaten:
Wie meinst Du das? Meine Antwort auf eine so formulierte Frage wäre jetzt: Nutze die ``print``-FunktionPadidem hat geschrieben: und wie kann ich mir dann eine Dezimalzahl ausgeben lassen?

encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
assert encoding_kapiert
also wenn ich den Befehl ausführe bekomme ich als Ergebnis:
Code: Alles auswählen
Out[41]: [(0,)]
- Hyperion
- Moderator
- Beiträge: 7478
- Registriert: Freitag 4. August 2006, 14:56
- Wohnort: Hamburg
- Kontaktdaten:
Schau Dir mal meine Tipps hier an: http://www.python-forum.de/viewtopic.ph ... 00#p270000
Offenbar kommt als Ergebnis da 0 raus. Sofern es nur *ein* Ergebnis geben kann, solltest Du auch ``fetchone()`` nutzen statt ``fetchall`` - ist Dir iirc auch schon mal gesagt worden. Dann hast Du nur ein Tupel und keine äußere Liste...
Offenbar kommt als Ergebnis da 0 raus. Sofern es nur *ein* Ergebnis geben kann, solltest Du auch ``fetchone()`` nutzen statt ``fetchall`` - ist Dir iirc auch schon mal gesagt worden. Dann hast Du nur ein Tupel und keine äußere Liste...
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
assert encoding_kapiert
- Hyperion
- Moderator
- Beiträge: 7478
- Registriert: Freitag 4. August 2006, 14:56
- Wohnort: Hamburg
- Kontaktdaten:
Das ist vom Zahlentyp abhängig! In Python wird ab Version 3.x standardmäßig bei der Division von Integern ein ``float`` zurückgegeben. Man kann aber auch über den ``//``-Operator eine ganzzahliges Ergebnis berechnen:Padidem hat geschrieben:aber 16538 / 80613 muss doch eine Dezimalzahl ergeben und nicht 0...
Code: Alles auswählen
>>> 16538 / 80613
0.20515301502239092
>>> 16538 // 80613
0

Was willst Du denn damit erreichen?Padidem hat geschrieben: Könnte ich die Abfragen auch über .executescript verbinden?
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
assert encoding_kapiert
@Padidem: Du mußt halt die Integer-Werte vor dem Teilen in Decimalzahlen umwandeln.
Bei SQL macht man das üblicherweise über die cast-Funktion:
@Hyperion: auch wenn die sum-Funktion und noch so einiges andere das Gegenteil vermuten lassen, es soll zum Schluß pro Bundesland eine Zeile entstehen.
Bei SQL macht man das üblicherweise über die cast-Funktion:
Code: Alles auswählen
SELECT cast(16538 as float)
- Hyperion
- Moderator
- Beiträge: 7478
- Registriert: Freitag 4. August 2006, 14:56
- Wohnort: Hamburg
- Kontaktdaten:
Das bedeutet aber doch nicht, dass man die Query erst einmal *extern* in dem dafür vorgesehenem Werkzeug erstellt und anschließend in das Python-Script übernimmt‽Padidem hat geschrieben:@ Hyperion: leider müssen wir alle Aufgaben über Python erledigen
Offenbar kommt nicht das Ergebnis heraus, was Du erwartest. Also musst Du forschen, woran das liegt bzw. was wirklich passiert. Das macht man nun einmal in einer SQL-Shell. Wenn Du dann die fertige Query hast, kopierst Du sie heraus und fügst sie im Quellcode ein. Wo ist da ein Widerspruch zur Aufgabenstellung?
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
assert encoding_kapiert
- Hyperion
- Moderator
- Beiträge: 7478
- Registriert: Freitag 4. August 2006, 14:56
- Wohnort: Hamburg
- Kontaktdaten:
Was denn für Einzelabfragen?Padidem hat geschrieben:ich dachte mit dem executescript könnte man auch die einzelabfragen zu einer zusammenfassen
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
assert encoding_kapiert
@Padidem: Die Aufgabenstellung spricht doch aber von *einer* Abfrage. Die einzelnen Punkte/Spiegelstriche in der Aufgabenstellung können ja schon deswegen nicht als Einzelabfragen gemeint sein weil der letzte Punkt gar nicht als solche umgesetzt werden kann sondern eine allgemeine Einschränkung des Ergebnisses darstellt.
Wie Hyperion schon sagte, solltest Du diese Abfrage in einem geeignetem Programm entwickeln und testen. Da ist nichts dynamisches drin, also ist das was Python zu dieser Aufgabe beiträgt nur *eine* SQL-Abfrage abzusetzen und die Datensätze auszugeben die dabei heraus kommen.
Wie Hyperion schon sagte, solltest Du diese Abfrage in einem geeignetem Programm entwickeln und testen. Da ist nichts dynamisches drin, also ist das was Python zu dieser Aufgabe beiträgt nur *eine* SQL-Abfrage abzusetzen und die Datensätze auszugeben die dabei heraus kommen.