Summe bilden und Wert abziehen

Installation und Anwendung von Datenbankschnittstellen wie SQLite, PostgreSQL, MariaDB/MySQL, der DB-API 2.0 und sonstigen Datenbanksystemen.
Antworten
obelisk.asterisk
User
Beiträge: 19
Registriert: Donnerstag 14. Januar 2010, 23:12

Hallo forum,

ich möcht aus einer Datenbank die Summe der Gespräche auslesen und
und die Handy, Internationale und Nationale Gespräche abziehen.

Gibt es da einen bestimmten Befehl mit dem man so etwas ausführen kann ? :?:

Bedanke mich im vorraus.


z.B

Code: Alles auswählen


Select SUM(billsec) FROM bla WHERE (blabla LIKE '0%')


obelist.asterisk
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Naja, der Ansatz mit dem where ist doch schon gut. Du willst ja nur die Werte aus Tupeln aufsummieren, die bestimmte Eigenschaften nicht haben. Also so in der Art:

Code: Alles auswählen

SELECT SUM(spalte_a)
FROM foo
WHERE spalte_b <> ' ' AND spalte_c <> '...' AND... ;
Welche Spalte das nun ist bzw. wie man diese Eigenschaft erkennt, kannst nur Du uns sagen / zeigen ;-)

(Ggf. wäre eine positive Einstufung aber sinnvoller... also nur die, die eine bestimmte Eigenschaft erfüllen!)
obelisk.asterisk
User
Beiträge: 19
Registriert: Donnerstag 14. Januar 2010, 23:12

Hallo,

danke für die Antwort.
Kann man so etwas auch mit einem REGEXP lösen und nur bestimmte
Telefonnummern herrausfiltern? :?:


obelisk.asterisk
Benutzeravatar
noisefloor
User
Beiträge: 3856
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

Hallo,

wie wäre es mit einer GROUP BY Klausel? :-)

Gruß, noisefloor
Benutzeravatar
/me
User
Beiträge: 3555
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

obelisk.asterisk hat geschrieben:Kann man so etwas auch mit einem REGEXP lösen und nur bestimmte Telefonnummern herrausfiltern? :?:
Wenn deine Datenbank reguläre Ausdrücke in der SELECT-Syntax unterstützt geht das. Schau einfach mal in die Dokumentation deines Datenbanksystems.

Auf eine Datenbank mit regulären Ausdrücken oder auch mit LIKE '%WERT%' zuzugreifen ist allerdings etwas, was man möglichst vermeiden will. Für solche Anfragen muss die DB jedesmal einen Full-Table-Scan durchführen, da ein Index nicht benutzt werden kann. Wenn man irgendwie Möglichkeiten sieht das ganze durch eine andere Struktur vermeiden zu können oder zumindest die Kosten durch die Angabe einer zusätzlichen Bedingung (auf die dann natürlich per Index zugegriffen werden sollen könnte) zu reduzieren, dann sollte man das auf jeden Fall machen.
lunar

Idealerweise sollte man die Telefonnummern vorher zerlegen, und in den internationalen Teil, das Netz bzw. die Vorwahl und den Rest auftrennen. Dann ließe sich das einfacher bewerkstelligen.
obelisk.asterisk
User
Beiträge: 19
Registriert: Donnerstag 14. Januar 2010, 23:12

Hallo an alle,

vielen dank an euch.
Könnt ihr euch mal meine REGEXP anschauen.
Er bringt mir falsche Werte.

Code: Alles auswählen


sql3 = """SELECT COUNT(blabla) FROM tttt WHERE ziel REGEXP '^0[1-9].* | ^[1-9].*' AND ziel NOT REGEX '^01[5-7].*|^112.*|^118.*|^0700.*|0800.*|^0137.*|^0180.*' AND (calldate >= CURRENT_DATE - INTERVAL 10 DAY)"""

cursor.execute(sql3)


bedanke mich im vorraus.

obelist.asterisk
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Hallo.

"Funktioniert nicht" oder "liefert falsche Werte" sind keine vernünftigen Fehlerbeschreibungen ;-) Du musst schon sagen, was du als Ergebnis erwartest und was tatsächlich rauskommt. Hast du die einzelnen Teile der Anfrage auch mal einzeln getestet? So kannst du den Fehler zumindest eingrenzen.

Sebastian

Tip: man kann Ausdrücke auch zusammenfassen, dann schrumpft der letze wohl fast auf die Hälfte der Länge.
Das Leben ist wie ein Tennisball.
Benutzeravatar
/me
User
Beiträge: 3555
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

Als erstes: Rede mal mit demjenigen der die Datenstruktur verbrochen hat und schau mal ob sich das nicht wirklich in irgendetwas umstellen lässt wo die regulären Ausdrücke nicht mehr bzw. nicht mehr in der Menge benötigt werden.

obelisk.asterisk hat geschrieben:

Code: Alles auswählen

... WHERE ziel REGEXP '^0[1-9].* | ^[1-9].*' ...
Was soll dieser Teil des Ausdrucks machen?
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

noisefloor hat geschrieben:Hallo,

wie wäre es mit einer GROUP BY Klausel? :-)

Gruß, noisefloor
Was sollte das hier bewirken?
obelisk.asterisk
User
Beiträge: 19
Registriert: Donnerstag 14. Januar 2010, 23:12

HALLO,

nach langem hin und her habe ich es so [GELÖST].

Code: Alles auswählen


text1 = 'NAME'
text2 = 'Handy'

sql1 = """Select COUNT(*) FROM BLA WHERE LALA REGEXP '^01[5-7].*' AND (calldate >= CURRENT_DATE - INTERVAL 10 DAY)"""
cursor.execute(sql1)

dat = cursor.fetchall()
for row in dat:
 text3 = (str(row[0]))


sql2 = """SELECT SUM(billsec) FROM BLA WHERE LALA REGEXP '^01[5-7].*' AND (calldate >= CURRENT_DATE - INTERVAL 10 DAY) AND (disposition='ANSWERED')""" 
cursor.execute(sql2)

dat = cursor.fetchone()
sec=dat[0]             
t = time.localtime(sec)
endcalls = time.strftime("%H:%M:%S",t)
text4 = (str(endcalls))

datei.writerow([text1, text2, text3, text4]) 


Wenn ich was ausschließen möchte dann gebe ich den Befehl NOT REGEXP ein.

Bedanke mich bei euch für eure Hilfe.

obelisk.asterisk :D
Benutzeravatar
noisefloor
User
Beiträge: 3856
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

Hi,
Hyperion hat geschrieben:
noisefloor hat geschrieben:Hallo,

wie wäre es mit einer GROUP BY Klausel? :-)

Gruß, noisefloor
Was sollte das hier bewirken?
Kommt auf die Datenstruktur an, die ja hier nicht bekannt ist.

Wenn man mit GROUP BY nach Festnetz / Handy / ... gruppieren kann (könnte), wäre man schon mal nen Schritt weiter. :-)

Gruß, noisefloor
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

noisefloor hat geschrieben:Hi,
Hyperion hat geschrieben:
noisefloor hat geschrieben:Hallo,

wie wäre es mit einer GROUP BY Klausel? :-)

Gruß, noisefloor
Was sollte das hier bewirken?
Kommt auf die Datenstruktur an, die ja hier nicht bekannt ist.

Wenn man mit GROUP BY nach Festnetz / Handy / ... gruppieren kann (könnte), wäre man schon mal nen Schritt weiter. :-)

Gruß, noisefloor
Stimmt. Daran hatte ich nicht gedacht. Guter Einwand.
Antworten