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
Möglichkeit Drei Abfragen zu verbinden
@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) / 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]
[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) / 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]
Hallo,
das bsp. wird einmal probiert
und
Danke
mfg Peter
die von PyQt5.QtSql und zwar den QPSQL Treiberwelche Datenbankanbindung benutzt Du?
Möglich. ein kurzes Antesten hat soweit keine Fehler gezeigt heist aber nicht das nicht noch welche da sind.Die Abfrage für zwischen 22Uhr und 6Uhr sieht fehlerhaft aus.
das bsp. wird einmal probiert
und
Danke
mfg Peter
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:
Falls Dir das sowieso alles klar ist und ich Deine Abfragetexte falsch interpretiert habe, tut's mir leid - aber vielleicht hilft es jemand anderem.
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_()
Hallo,
NUR ALS BSP Code sieht teilweise ähnlich aus.
Es funkioniert und genügt den momentanen Ansprüchen
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
Ähnlich wie untenwie führst Du die Abfragen in Deinem Programm aus?
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]))
JaMir sehen die Abfragetexte so aus, als würdest Du die jeweiligen Parameter per Stringformatierung hineinmontieren
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.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.
Die Abfrage Text waren Richtig Interpretiert also da gibt es nichts leid zu tun Entspricht auch der Wahrheit.Falls Dir das sowieso alles klar ist und ich Deine Abfragetexte falsch interpretiert habe, tut's mir leid - aber vielleicht hilft es jemand anderem.
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
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?
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?