 |
| Hinweise |
Willkommen im TP-Hilfe-Forum!Dies ist ein Forum zu den Themen Photoshop, Dreamweaver, Flash, Selbständigkeit und mehr, in dem Du Hilfe, Anleitung oder eine Lösung zu Deinen Problemen erhältst. Aktuell bist Du in unseren Foren als Gast mit reinen Leserechten unterwegs. Wenn Du Dich registrierst, kannst Du eigene Themen verfassen, deine Frage stellen und privat mit anderen TPlern kommunizieren. Weitere Foren werden zugänglich, und Du wirst – falls gewünscht – per Mail über neue Beiträge informiert. Die Registrierung ist schnell und kostenlos. Sollten bei der Registrierung Fragen auftauchen, reicht ein Klick in unsere Hilfe - Häufig gestellte Fragen oder eine kurze Mitteilung an das Support-Team. Viel Spaß bei Traum-Projekt.com |
30.05.2008, 14:05
|
#1
|
|
TP-Veteran
Registriert seit: Oct 2002
Ort: Übach-Palenberg
|
[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).
|
|
|
30.05.2008, 17:32
|
#2
|
|
TP-Moderator
Registriert seit: Jun 2004
Ort: Hannover
|
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
|
|
|
01.06.2008, 17:39
|
#3
|
|
TP-Veteran
Registriert seit: Oct 2002
Ort: Übach-Palenberg
|
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
|
|
|
01.06.2008, 17:48
|
#4
|
|
TP-Moderator
Registriert seit: Jun 2004
Ort: Hannover
|
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
|
|
|
01.06.2008, 17:49
|
#5
|
|
TP-Special Mod
Registriert seit: Feb 2005
Ort: Haan / NRW
|
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.
|
|
|
02.06.2008, 19:45
|
#6
|
|
TP-Veteran
Registriert seit: Oct 2002
Ort: Übach-Palenberg
|
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
|
|
|
02.06.2008, 20:05
|
#7
|
|
TP-Special Mod
Registriert seit: Feb 2005
Ort: Haan / NRW
|
lass Dir sowas doch in einer Funktion generieren, dann ist egal wie gross das Monster wird 
|
|
|
03.06.2008, 13:04
|
#8
|
|
TP-Veteran
Registriert seit: Oct 2002
Ort: Übach-Palenberg
|
@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
|
|
|
03.06.2008, 23:33
|
#9
|
|
TP-Special Mod
Registriert seit: Feb 2005
Ort: Haan / NRW
|
nurmal als Anregung ein Ansatz:
PHP-Code:
$subqueries = array( 'table1' => 'field1|field2>0', 'table2' => 'field2', 'table3' => 'field3', ); $subquerySQL = buildSubqueries($subqueries, 5, '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; }
|
|
|
|
Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)
|
|
|
| Themen-Optionen |
Thema durchsuchen |
|
|
|
| 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.
HTML-Code ist aus.
|
|
|
Alle Zeitangaben in WEZ +2. Es ist jetzt 00:30 Uhr.
|
 |