power-box.de
-


Hinweise


Antwort
 
LinkBack Themen-Optionen Thema durchsuchen Thema bewerten
Alt 30.05.2008, 14:05   #1
TP-Veteran
 
Benutzerbild von Master_T2
 
Registriert seit: Oct 2002
Ort: Übach-Palenberg
Master_T2 macht sich hier sehr viel Mühe

[SQL] Großes Problem bei Durchnittsberechnung


Hi, es geht um folgenden Query:

Code:
SELECT
FORMAT(SUM(coalesce(a.betrag_auszaehlung, 0)   
    + coalesce(b.betrag_auszaehlung, 0)
    + coalesce(c.betrag_auszaehlung, 0)
    + coalesce(d.betrag_auszaehlung, 0)) 
    / (COUNT(a.betrag_auszaehlung) 
    + COUNT(b.betrag_auszaehlung)
    + COUNT(c.betrag_auszaehlung)
    + COUNT(d.betrag_auszaehlung)
      ) 
, 2) AS `SUMME`,  
e.anzeigename as `e`, f.anzeigename as `f`
FROM g
LEFT JOIN h ON g.fk_auftragsart = h.oid 
LEFT JOIN i ON g.oid = i.fk_vorgang
LEFT JOIN j ON g.oid = j.fk_vorgang 
LEFT JOIN k ON j.oid = k.fk_bearbeitung
LEFT JOIN l ON j.oid = l.fk_bearbeitung
LEFT JOIN m ON j.oid = m.fk_bearbeitung
LEFT JOIN a ON m.oid = a.fk_bearbeitungsschritt_meldung
LEFT JOIN b ON m.oid = b.fk_bearbeitungsschritt_meldung
LEFT JOIN d ON m.oid = d.fk_bearbeitungsschritt_meldung
LEFT JOIN c ON m.oid = c.fk_bearbeitungsschritt_meldung
LEFT JOIN e ON g.fk_e = e.oid
LEFT JOIN f ON e.fk_f = f.oid
WHERE  g.datum_ausfuehrung <= '2008-03-10 00:00:00' 
AND  i.entsorgung = '1' 
AND  h.kuerzel = 'TEST'
AND  (l.fk_ausfuehrung_art != '3' OR k.oid IS NULL)
AND  f.geloescht = '0'
AND  e.geloescht = '0'
GROUP BY f.anzeigename, e.anzeigename
HAVING SUMME IS NOT NULL
(Die wirklichen Tabellennamen musste ich leider maskieren)

Die Berechnung des Durchschnitts sieht etwas komplizierter aus, da ohne NULL-Werte gerechnet werden soll was mit AVG() nicht funktioniert.

Der Query funktioniert so wie er ist einwandfrei.

Jetzt zum Problem:
Es sollen NUR die LETZTEN 5 Beträge für die Berechnung des Durchschnittswertes herangezogen werden. Bei einer Tabelle würde ich das ja mit nem Subselect hinbekommen à la:

Code:
SELECT avg(b.{col}) FROM (SELECT {col} FROM {table} ORDER BY {col} DESC LIMIT 10) as b
Nur ich habe keinen Plan wie ich das bei diesem QWuery umsetzen soll. Hat jemand eine Idee?
__________________
Grüße aus Übach-Palenberg
Tim

WEB.ASSISTANTS IT-SOLUTIONS
www.web-assistants.de

Hängt das doch mal an eine beliebige PHP-Datei: ?=PHPE9568F36-D428-11d2-A769-00AA001ACF42

Geändert von Master_T2 (30.05.2008 um 14:28 Uhr).
Master_T2 ist offline   Mit Zitat antworten


Alt 30.05.2008, 17:32   #2
TP-Moderator
 
Benutzerbild von Adromir
 
Registriert seit: Jun 2004
Ort: Hannover
Adromir ist ein richtiges Arbeitstier - DANKEAdromir ist ein richtiges Arbeitstier - DANKEAdromir ist ein richtiges Arbeitstier - DANKEAdromir ist ein richtiges Arbeitstier - DANKEAdromir ist ein richtiges Arbeitstier - DANKEAdromir ist ein richtiges Arbeitstier - DANKE
Sortierst die Zeilen nach einer Spalte der maßgeblichen Tabelle und setzt ein Limit..
__________________
Je größer der Deppenfaktor, desto gigantischer das Bescheidwissergefühl
-Dieter Nuhr
Adromir ist offline   Mit Zitat antworten
Alt 01.06.2008, 17:39   #3
TP-Veteran
 
Benutzerbild von Master_T2
 
Registriert seit: Oct 2002
Ort: Übach-Palenberg
Master_T2 macht sich hier sehr viel Mühe
Es sind aber 4 Tabellen die bei der Berechnung des Durchschnitts maßgeblich sind!?
__________________
Grüße aus Übach-Palenberg
Tim

WEB.ASSISTANTS IT-SOLUTIONS
www.web-assistants.de

Hängt das doch mal an eine beliebige PHP-Datei: ?=PHPE9568F36-D428-11d2-A769-00AA001ACF42
Master_T2 ist offline   Mit Zitat antworten
Alt 01.06.2008, 17:48   #4
TP-Moderator
 
Benutzerbild von Adromir
 
Registriert seit: Jun 2004
Ort: Hannover
Adromir ist ein richtiges Arbeitstier - DANKEAdromir ist ein richtiges Arbeitstier - DANKEAdromir ist ein richtiges Arbeitstier - DANKEAdromir ist ein richtiges Arbeitstier - DANKEAdromir ist ein richtiges Arbeitstier - DANKEAdromir ist ein richtiges Arbeitstier - DANKE
Naja, aber aus einer Tabelle wird sich doch genau ergeben, welcher Eintrag logisch der erste und welcher der letzte ist. Diese Brauchst du doch nur Absteigend sortieren und mit Limit 0,5 hast du dann immer die letzten 5 Einträge..

Oder hab ich dich da falsch verstanden?
__________________
Je größer der Deppenfaktor, desto gigantischer das Bescheidwissergefühl
-Dieter Nuhr
Adromir ist offline   Mit Zitat antworten
Alt 01.06.2008, 17:49   #5
TP-Special Mod
 
Benutzerbild von steffenk
 
Registriert seit: Feb 2005
Ort: Haan / NRW
steffenk lebt für das TP und seine Usersteffenk lebt für das TP und seine Usersteffenk lebt für das TP und seine Usersteffenk lebt für das TP und seine Usersteffenk lebt für das TP und seine Usersteffenk lebt für das TP und seine Usersteffenk lebt für das TP und seine Usersteffenk lebt für das TP und seine User
das wird schwer, das in einer Query hinzubekommen, zumal Du schon ein Monster hast.

Du musst Dir also eine Query mit 5 Subqueries bauen, das den entsprechenden Durchschnitt liefert und Die Hauptquery daraus wieder den Durchschnitt nimmt.
__________________

Typo3 · MySQLDumper · dislabs
·
manche Mühlen mahlen schneller ...
"Ich habe Rücken"
Horst Schlämmer
steffenk ist offline   Mit Zitat antworten
Alt 02.06.2008, 19:45   #6
TP-Veteran
 
Benutzerbild von Master_T2
 
Registriert seit: Oct 2002
Ort: Übach-Palenberg
Master_T2 macht sich hier sehr viel Mühe
Zitat:
Du musst Dir also eine Query mit 5 Subqueries bauen, das den entsprechenden Durchschnitt liefert und Die Hauptquery daraus wieder den Durchschnitt nimmt.
Ja sowas habe ich befürchtet... Danke euch trotzdem. Werde mal nach alternativen schauen, auf 5 Subqueries habe ich definitiv keine Lust, zumal das bei weitem nicht der eizige solcher Monster hier ist...
__________________
Grüße aus Übach-Palenberg
Tim

WEB.ASSISTANTS IT-SOLUTIONS
www.web-assistants.de

Hängt das doch mal an eine beliebige PHP-Datei: ?=PHPE9568F36-D428-11d2-A769-00AA001ACF42
Master_T2 ist offline   Mit Zitat antworten
Alt 02.06.2008, 20:05   #7
TP-Special Mod
 
Benutzerbild von steffenk
 
Registriert seit: Feb 2005
Ort: Haan / NRW
steffenk lebt für das TP und seine Usersteffenk lebt für das TP und seine Usersteffenk lebt für das TP und seine Usersteffenk lebt für das TP und seine Usersteffenk lebt für das TP und seine Usersteffenk lebt für das TP und seine Usersteffenk lebt für das TP und seine Usersteffenk lebt für das TP und seine User
lass Dir sowas doch in einer Funktion generieren, dann ist egal wie gross das Monster wird
__________________

Typo3 · MySQLDumper · dislabs
·
manche Mühlen mahlen schneller ...
"Ich habe Rücken"
Horst Schlämmer
steffenk ist offline   Mit Zitat antworten
Alt 03.06.2008, 13:04   #8
TP-Veteran
 
Benutzerbild von Master_T2
 
Registriert seit: Oct 2002
Ort: Übach-Palenberg
Master_T2 macht sich hier sehr viel Mühe
@steffen: könntest du mir denn mal ein Beispiel (ganz einfach im Pseudocode) geben wie du es mit 5 Subqueries machen würdest?
__________________
Grüße aus Übach-Palenberg
Tim

WEB.ASSISTANTS IT-SOLUTIONS
www.web-assistants.de

Hängt das doch mal an eine beliebige PHP-Datei: ?=PHPE9568F36-D428-11d2-A769-00AA001ACF42
Master_T2 ist offline   Mit Zitat antworten
Alt 03.06.2008, 23:33   #9
TP-Special Mod
 
Benutzerbild von steffenk
 
Registriert seit: Feb 2005
Ort: Haan / NRW
steffenk lebt für das TP und seine Usersteffenk lebt für das TP und seine Usersteffenk lebt für das TP und seine Usersteffenk lebt für das TP und seine Usersteffenk lebt für das TP und seine Usersteffenk lebt für das TP und seine Usersteffenk lebt für das TP und seine Usersteffenk lebt für das TP und seine User
nurmal als Anregung ein Ansatz:

PHP-Code:
$subqueries = array(
  
'table1' => 'field1|field2>0',
  
'table2' => 'field2',
  
'table3' => 'field3',
);
$subquerySQL buildSubqueries($subqueries5'AVG');
echo 
$subquerySQL;

function 
buildSubqueries($fieldArray$limit$operation) {
    
    
    
    
// build query
    
$sql = array();
    foreach (
$fieldArray as $table => $fields) {
        
$field explode('|',$fields);
        
$sql[] = "(SELECT $operation($field[0]) FROM `$table`" . ($field[1] ? " WHERE $field[1]" '') . " LIMIT $limit)";
    }
    
    switch (
$operation) {
        case 
'SUM':
            
$query implode(' + '$sql); 
            break;
        case 
'AVG':
            
$query '(' implode(' + '$sql) . ')/' count($sql); 
            break;
    }
    
    
    return 
$query;

__________________

Typo3 · MySQLDumper · dislabs
·
manche Mühlen mahlen schneller ...
"Ich habe Rücken"
Horst Schlämmer
steffenk ist offline   Mit Zitat antworten
Antwort

  Aktuelles Thema
  TP Hilfe Forum > Web-Editoren & Coding > Traum-Dynamik
[SQL] Großes Problem bei Durchnittsberechnung [SQL] Großes Problem bei Durchnittsberechnung
« preg_replace + base64 | Formular Fertig, wie übertrage ich nun auf ein Script »

Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)
 
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Thema bewerten
Thema bewerten:

Forumregeln
Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are an
Gehe zu


Alle Zeitangaben in WEZ +2. Es ist jetzt 00:30 Uhr.

Powered by: vBulletin Version 3.7 (Deutsch)
Copyright ©2000 - 2008, Jelsoft Enterprises Ltd. / Search Engine Friendly URLs by vBSEO 3.2.0 ©2008, Crawlability, Inc.
Traum-Projekt.com | Suchen | Archiv | Impressum | Kontakt | | | Nach oben |



1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67