php-resource




Archiv verlassen und diese Seite im Standarddesign anzeigen :
Eleganter Lösung für rechnen in MYSQL gesucht


 
mr_apollon
29-07-2011, 00:49 
 
Hallo Ihr Nachtschwärmer,

im Moment stehe ich wieder mal etwas auf dem Schlauch. Mit folgender Datenbankabfrage errechne ich offene Rechnungen. Läuft auch ganz gut, sieht mir nur zu gigantisch aus ;)

Gibt es für den Query eine elegantere, performantere Lösung und wie bekomme ich es hin das Umsätze sum(summe) = 0 garnicht ausgegeben werden?

:danke:
...und gute Nacht :beer:

 
streuner
29-07-2011, 09:01 
 
und wie bekomme ich es hin das Umsätze sum(summe) = 0 garnicht ausgegeben werden?...Bedingung in deine WHERE Bedingung packen (kleines tut dazu: http://www.techonthenet.com/sql/sum.php) oder evtl. IIF verwenden!

mfg streuner

 
mr_apollon
29-07-2011, 09:52 
 
Okay mit dem Where war klar ;) war nur in der Nacht nicht auf die Idee gekommen das nochmal zu verschachteln.

Hat jemand eine Idee wie man die ganze Abfrage performanter gestalten kann?

 
streuner
29-07-2011, 09:54 
 
Statt den * die Spaltennamen schreiben, die Du brauchst;)! Dauert Dir die Abfrage zu lange, oder ist das ne allg. Frage, wie man das performanter machen kann??

mfg streuner

 
mr_apollon
29-07-2011, 10:01 
 
Im Moment habe ich nur eine Hand voll Testdaten, wo die Abfrage flott läuft. Irgendwie sieht mir die ganze Sache aber zu übertrieben aus. :dontknow:

 
streuner
29-07-2011, 10:15 
 
Na ja, du kannst doch auch deine 4 SELECT's die du mit UNION ALL verknüpfst, in 2 umwandeln - du hast das ja jeweils aufgesplittet! Ob das jetzt performanter ist...:dontknow:! Am besten wäre es, du hättest ne große Menge Daten um zu testen. Die Länge deines SQL Statements sagt nicht zwangsläufig was darüber aus, wie effizient gearbeitet wird!

mfg streuner

 
mr_apollon
29-07-2011, 10:26 
 
hmmm, ich glaube ich kann es nicht zusammenfassen, da ich ja jeweils das konto im datensatz brauche was > 9999 ist. sonst müsste ich über ein subselect wieder schauen ob konto oder gegenkonto >9999 ist :goth:

 
h3ll
29-07-2011, 10:37 
 
Was bedeutet diese Zahl überhaupt?

 
mr_apollon
29-07-2011, 10:49 
 
durch die 2 spalten konto und gegenkonto wird eine buchung abgebildet. entweder ist es ein geschäftsvorgang (zahl < 10000) oder ein kunde (zahl > 9999). die kundennummer kann in abhängigkeit des saldo (s oder h) im konto oder im gegenkonto stehen. ich brauche nun die kundennummern mit zugehöriger rechnungsnummer die noch offen sind.

 
h3ll
29-07-2011, 11:05 
 
Das ist Pfusch. Ein Zahlenbereich darf keine Bedeutung haben. Leg eine zusätzliche Spalte an, die die Art des Datensatzes enthält (also ob es ein Geschäftsvorgang oder ein Kunde ist). Danach könnte man auch wunderbar gruppieren und die Abfrage sehr stark vereinfachen.

 
onemorenerd
29-07-2011, 13:12 
 
Ich habe die Query nur überflogen, aber du selektierst immer über der gleichen Tabelle. Kann mir nicht vorstellen, dass das nicht auch mit geeigneten OR-Verknüpfungen zu machen ist. Dann wären die UNIONS schon mal weg - ob das schneller geht, verrät EXPLAIN.
Vielleicht kann man dann auch noch die beiden äußeren SELECTs eliminieren. Die hab ich mir jetzt noch nicht angesehen.


Alle Zeitangaben in WEZ +2. Es ist jetzt 20:52 Uhr.