Möglichkeit Drei Abfragen zu verbinden

Installation und Anwendung von Datenbankschnittstellen wie SQLite, PostgreSQL, MariaDB/MySQL, der DB-API 2.0 und sonstigen Datenbanksystemen.
Antworten
Peter1977
User
Beiträge: 85
Registriert: Mittwoch 4. September 2013, 14:59

Hallo,

Habe im Moment 3 Abfragen über eine Tabelle mit den gleichen Spalten nur für unterschiedlichen Zeiten
Abfrage 1 für 6-14Uhr
Abfrage 2 für 14-22 Uhr
Abfrage 3 für 22-6Uhr

Abfrage1:
[codebox=postgresql file=Abfrage1l]SELECT
COUNT(arbeitsauftrag_id) as Stk,
SUM(fertig_x*fertig_y*fertig_z*7.85/1000000) as Gewicht,
SUM(zeit) as Zeit
FROM arbeitsauftrag
WHERE
date_part('year',datum)='%s' AND date_part('month',datum)='%s' AND
date_part('day', datum)='%s' AND
EXTRACT(Hour FROM datum)<14 AND EXTRACT(HOUR FROM datum)>=6[/code]
Abfrage2:
[codebox=postgresql file=Unbenannt.sql]SELECT
COUNT(arbeitsauftrag_id) as Stk,
SUM(fertig_x*fertig_y*fertig_z*7.85/1000000) as Gewicht,
SUM(zeit) as Zeit
FROM arbeitsauftrag
WHERE
date_part('year',datum)='%s' AND date_part('month',datum)='%s' AND
date_part('day', datum)='%s' AND
EXTRACT(Hour FROM datum)>=14 AND EXTRACT(HOUR FROM datum)<22[/code]
Abfrage3:
[codebox=postgresql file=Unbenannt.sql]SELECT
COUNT(arbeitsauftrag_id) as Stk,
SUM(fertig_x*fertig_y*fertig_z*7.85/1000000) as Gewicht,
SUM(zeit) as Zeit
FROM arbeitsauftrag
WHERE
date_part('year',datum)='%s' AND date_part('month',datum)='%s' AND
date_part('day', datum)='%s' AND
NOT (EXTRACT(Hour FROM datum)<22 AND EXTRACT(HOUR FROM datum)>=6)[/code]

Kann man diese 3 Abfragen Sinngemäß zusammen führen?

mfg Peter
Sirius3
User
Beiträge: 17710
Registriert: Sonntag 21. Oktober 2012, 17:20

@Peter1977: welche Datenbankanbindung benutzt Du? Die Abfrage für zwischen 22Uhr und 6Uhr sieht fehlerhaft aus. Am einfachsten ist es, direkt mit Datumstypen zu arbeiten
[codebox=sql file=Unbenannt.sql]
SELECT
COUNT(arbeitsauftrag_id) AS Stk,
SUM(fertig_x*fertig_y*fertig_z*7.85/1000000) AS Gewicht,
SUM(zeit) AS Zeit
FROM arbeitsauftrag WHERE datum >= :von AND datum < :bis
[/code]
wenn Du dagegen die Früh-, Spät- und Nachtschicht in einem SELECT gruppieren willst, dann mußt Du die Zeitstempel einfach passend umrechnen (Schichten seit dem 1.1.1900 o.ä.):
SELECT
CONVERT(INT, (DATEDIFF(HOUR, '19000101', datum) - 6) / 8) AS Schicht
COUNT(arbeitsauftrag_id) AS Stk,
SUM(fertig_x*fertig_y*fertig_z*7.85/1000000) AS Gewicht,
SUM(zeit) AS Zeit
FROM arbeitsauftrag GROUP BY Schicht
[/Codebox]
Peter1977
User
Beiträge: 85
Registriert: Mittwoch 4. September 2013, 14:59

Hallo,
welche Datenbankanbindung benutzt Du?
die von PyQt5.QtSql und zwar den QPSQL Treiber
Die Abfrage für zwischen 22Uhr und 6Uhr sieht fehlerhaft aus.
Möglich. ein kurzes Antesten hat soweit keine Fehler gezeigt heist aber nicht das nicht noch welche da sind.

das bsp. wird einmal probiert
und

Danke
mfg Peter
bb1898
User
Beiträge: 199
Registriert: Mittwoch 12. Juli 2006, 14:28

Noch etwas: wie führst Du die Abfragen in Deinem Programm aus? Mir sehen die Abfragetexte so aus, als würdest Du die jeweiligen Parameter per Stringformatierung hineinmontieren, und das ist mit den PyQt-SQL-Methoden genau so falsch wie mit psycopg2 oder irgend einem anderen Datenbanktreiber. In der Antwort von Sirius ist es richtig (WHERE datum >= :von AND datum < :bis), nur ist er auf diesen Aspekt nicht ausdrücklich eingegangen und hat auch nicht gezeigt, wie die Parameterwerte mit der Abfrage verbunden werden.

Nach meinem besten Wissen und Gewissen geht das immer noch ungefähr so wie in meinem alten Lehrbuch:

Code: Alles auswählen

# Annahme: die Datenbankverbindung ist schon eingerichtet und nicht benannt,
# es ist also die Default-Verbindung.
# Datumsparameter, nur als Beispiel:
vondatum = datetime.date(2016,4,1)
bisdatum = datetime.date(2016,6,30)
query = QSqlQuery()
query.prepare("""SELECT
       COUNT(arbeitsauftrag_id) AS Stk,
       SUM(fertig_x*fertig_y*fertig_z*7.85/1000000) AS Gewicht,
       SUM(zeit) AS Zeit
    FROM arbeitsauftrag WHERE datum >= :von AND datum < :bis""")
query.bindValue(":von", vondatum)
query.bindValue(":bis", bisdatum)
query.exec_()
Falls Dir das sowieso alles klar ist und ich Deine Abfragetexte falsch interpretiert habe, tut's mir leid - aber vielleicht hilft es jemand anderem.
Peter1977
User
Beiträge: 85
Registriert: Mittwoch 4. September 2013, 14:59

Hallo,
wie führst Du die Abfragen in Deinem Programm aus?
Ähnlich wie unten

NUR ALS BSP Code sieht teilweise ähnlich aus.

Code: Alles auswählen

from module import db
SQL_Statement="SELECT spalte1,spalte2 FROM tabelle"
Result=db.DBConnect(SQL_Statement)
for Row in Result:
	print ("%s - %s")%(Row[0],Row[1]))
Es funkioniert und genügt den momentanen Ansprüchen
Mir sehen die Abfragetexte so aus, als würdest Du die jeweiligen Parameter per Stringformatierung hineinmontieren
Ja
In der Antwort von Sirius ist es richtig (WHERE datum >= :von AND datum < :bis), nur ist er auf diesen Aspekt nicht ausdrücklich eingegangen und hat auch nicht gezeigt, wie die Parameterwerte mit der Abfrage verbunden werden.
Das wusste ich bis jetzt nicht.
In der Antwort von Sirius ist es richtig (WHERE datum >= :von AND datum < :bis), nur ist er auf diesen Aspekt nicht ausdrücklich eingegangen und hat auch nicht gezeigt, wie die Parameterwerte mit der Abfrage verbunden werden.
War ja auch nicht Teil der Frage.
Falls Dir das sowieso alles klar ist und ich Deine Abfragetexte falsch interpretiert habe, tut's mir leid - aber vielleicht hilft es jemand anderem.
Die Abfrage Text waren Richtig Interpretiert also da gibt es nichts leid zu tun Entspricht auch der Wahrheit.

Das im meinen Code vieles nicht passen wird ist mir klar. Bin aber auch nicht von Fach. Bringt mir aber soweit das richtige Ergebnis auf den
Bildschirm.

mfg Peter
bb1898
User
Beiträge: 199
Registriert: Mittwoch 12. Juli 2006, 14:28

Ok, wenn das so ist, verweise ich auf eine vernünftige Erklärung zum Übergeben von Parametern an SQL-Abfragen: http://initd.org/psycopg/docs/usage.htm ... ql-queries.
Das ist die Dokumentation zu psycopg2 und passt deshalb syntaktisch nicht zu PyQt. Aber inhaltlich scheint es mir die Sache gut zu erläutern (und für andere Python-Datenbanktreiber, die die Python DB API 2.0 Spezifikation implementieren, ist es mit sehr kleinen Anpassungen verwendbar). Für die Syntax gibt's die PyQt-Dokumentation, mein Beispiel ist eine von mehreren Möglichkeiten.

Da hänge ich jetzt selber noch eine Frage dran: die neuen PyQt5-Wheels für Windows scheinen die Beispiele nicht zu enthalten - wo kriegt man die denn am besten her? Aus den Quellpaketen?
Peter1977
User
Beiträge: 85
Registriert: Mittwoch 4. September 2013, 14:59

Hallo,

Danke
mfg Peter
Antworten