Seite 1 von 1
Summe bilden und Wert abziehen
Verfasst: Mittwoch 10. Februar 2010, 14:12
von obelisk.asterisk
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
Verfasst: Mittwoch 10. Februar 2010, 14:44
von Hyperion
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!)
REGEXP
Verfasst: Donnerstag 11. Februar 2010, 15:40
von obelisk.asterisk
Hallo,
danke für die Antwort.
Kann man so etwas auch mit einem REGEXP lösen und nur bestimmte
Telefonnummern herrausfiltern?
obelisk.asterisk
Verfasst: Donnerstag 11. Februar 2010, 18:07
von noisefloor
Hallo,
wie wäre es mit einer GROUP BY Klausel?
Gruß, noisefloor
Re: REGEXP
Verfasst: Donnerstag 11. Februar 2010, 18:36
von /me
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.
Verfasst: Donnerstag 11. Februar 2010, 19:05
von 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.
REGEXP
Verfasst: Freitag 12. Februar 2010, 09:31
von obelisk.asterisk
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
Verfasst: Freitag 12. Februar 2010, 09:46
von EyDu
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.
Re: REGEXP
Verfasst: Freitag 12. Februar 2010, 10:49
von /me
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:
Was soll dieser Teil des Ausdrucks machen?
Verfasst: Freitag 12. Februar 2010, 11:11
von Hyperion
noisefloor hat geschrieben:Hallo,
wie wäre es mit einer GROUP BY Klausel?
Gruß, noisefloor
Was sollte das hier bewirken?
[GELÖST]
Verfasst: Dienstag 16. Februar 2010, 18:07
von obelisk.asterisk
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

Verfasst: Mittwoch 17. Februar 2010, 21:44
von noisefloor
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
Verfasst: Mittwoch 17. Februar 2010, 21:49
von Hyperion
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.