Php + sql: umsatz im zeitraum x bis y

Hallo,

ich möchte eine Abfrage erstellen, welche mir den Umsatz mit allen Kunden innerhalb eines einzugebenen Zeitraumes errechnet.

Kunde A:
Vertragsbeginn am 01.01.05
Vertragsende am 01.05.05
Monatsbeitrag = 50€/Monat

Kunde B:
Vertragsbeginn am 01.02.05
Vertragsende am 01.02.06
Monatsbeitrag = 30€/Monat

Im Zeitraum vom 01.01.05 bis 31.12.2005 also
5 * 50€ + 10* 30€ = 550€

Folgende vier tabellen (spaltennamen) stehen zur Verfügung:

vertragsart (vertragsart_bezeichnung,monatsbeitrag,vertragslaufzeit)
bank (id_kontonummer,id_kunde,blz,bankname)
vertrag (id_kunde,id_vertragsart,vertragsbeginn,vertragsende)
kunde (id_kunde,vorname,…)

Mein php-Versuch:

$vbeg = Eingabe von (hier: 01.01.2005)
$vend = Eingabe bis (hier: 31.12.2005)

$sql_string = „select sum(months_between(’$vend’,’$vbeg’)*vertragsart.monatsbeitrag))
from vertrag, vertragsart, kunde,
where vertragsart.id_vertragsart=vertrag.id_vertragsart
and kunde.id_kunde = vertrag.id_kunde“;

Hierdurch rechnet er auch fein die Kundenumsätze aus und summiert diese, aber mein Denkfehler hierbei ist jedoch, dass er nicht berücksichtigt das der Vertrag von Kunde A bereits am 01.05. endet.

Ich verwende PHP 5.x sowie Oracle 8x (bzw. 10x).
Meine Erfahrungen mit SQL und PHP beschränken sich eher auf Grundfunktionen…

Wie baue ich ein, dass er ausschließlich Kunden für die Umsatzberechnung heranzieht, deren verträge innerhalb des eingegebenen Zeitraums liegen!?

Um Hilfestellung möchte ich hiermit freundlichst bitten.

Danke!

Dominik

PS: bitte erspart mir als Laien gut gemeinte Hinweise auf die php/sql-doku :wink:

Auch hallo.

Kunde A:
Vertragsbeginn am 01.01.05
Vertragsende am 01.05.05
Monatsbeitrag = 50€/Monat

Kunde B:
Vertragsbeginn am 01.02.05
Vertragsende am 01.02.06
Monatsbeitrag = 30€/Monat

Im Zeitraum vom 01.01.05 bis 31.12.2005 also
5 * 50€ + 10* 30€ = 550€

Folgende vier tabellen (spaltennamen) stehen zur Verfügung:

vertragsart
(vertragsart_bezeichnung,monatsbeitrag,vertragslaufzeit)
bank (id_kontonummer,id_kunde,blz,bankname)
vertrag (id_kunde,id_vertragsart,vertragsbeginn,vertragsende)
kunde (id_kunde,vorname,…)

Mein php-Versuch:

$vbeg = Eingabe von (hier: 01.01.2005)
$vend = Eingabe bis (hier: 31.12.2005)

Warum nicht aufsplitten ?
$vbeg_a = …
$vend_a = …
$vbeg_b = …
$vend_b = …

$sql_string = „select
sum(months_between(’$vend’,’$vbeg’)*vertragsart.monatsbeitrag))
from vertrag, vertragsart, kunde,
where vertragsart.id_vertragsart=vertrag.id_vertragsart
and kunde.id_kunde = vertrag.id_kunde“;

Mit dem oberen Vorschlag wären das dann zwei Abfragen

Hierdurch rechnet er auch fein die Kundenumsätze aus und
summiert diese, aber mein Denkfehler hierbei ist jedoch, dass
er nicht berücksichtigt das der Vertrag von Kunde A bereits am
01.05. endet.

Sicher ? Immerhin beträgt der Umsatz von Kunde A im Monat 06 bis 12 genau ‚0‘

HTH
mfg M.L.

Hoi,

danke erstmal für die schnelle Antwort.

Hierdurch rechnet er auch fein die Kundenumsätze aus und
summiert diese, aber mein Denkfehler hierbei ist jedoch, dass
er nicht berücksichtigt das der Vertrag von Kunde A bereits am
01.05. endet.

Sicher ? Immerhin beträgt der Umsatz von Kunde A im Monat 06
bis 12 genau ‚0‘

Da bin ich mir sogar ziemlich sicher, da er in meiner Abfrage nämlich garnicht das „Vertragsende“ und den „Vertragsbeginn“ aus der Tabelle „vertrag“ referenziert.

hmmm vielleicht sitz ich auch schon zu lange am PC…aber mir will die syntax der von dir gemeinten zweite abfrage nicht einfallen bzw. verstehe ich deinen ansatz nicht.
Vertragsende und Vertragsbeginn sind beides spalten der tabelle vertrag und enthalten ein datum.

$vbeg und $vend sind die variablen welche den zeitraum der berechnung angeben.

ein skilled programmierer den ich zufälligerweise kenne hat mir ein bisschen geholfen und ich bin nun ein paar wesentliche schritte weiter.
sobald alles so richtig funktioniert werd ich hier mal posten wie das ganze dann aussehen muss/kann.

hier das script.
dummerweise habe ich ein kleines „rundungsproblem“…
der rundet IMMER auf und nicht AB
was zwar gut für die firma, aber schlecht für den kunden sein wird *g*

$sql_string1 =„select round(sum(months_between(projekt9_vertrag.vertragsende,’$vbeg’)*projekt9_vertragsart.monatsbeitrag),0)from projekt9_vertrag, projekt9_vertragsart, projekt9_kunde, dual where projekt9_vertragsart.id_vertragsart=projekt9_vertrag.id_vertragsart and projekt9_kunde.id_kunde = projekt9_vertrag.id_kunde and projekt9_vertrag.vertragsbeginn = ‚$vbeg‘ and projekt9_vertrag.vertragsende = ‚$vend‘“;

$stmnt = OCIParse ($conn, $sql_string2);
OCIExecute($stmnt);
for($i=0 ;$wert=OCIFetchinto($stmnt,&$row); $i++)
{
$b = $row[0];
}

// || beginn || ende

$sql_string3 =„select round(sum(months_between(’$vend’,projekt9_vertrag.vertragsbeginn)*projekt9_vertragsart.monatsbeitrag),0)
from projekt9_vertrag, projekt9_vertragsart, projekt9_kunde, dual
where projekt9_vertragsart.id_vertragsart=projekt9_vertrag.id_vertragsart
and projekt9_kunde.id_kunde = projekt9_vertrag.id_kunde
and projekt9_vertrag.vertragsbeginn = ‚$vend‘“;

$stmnt = OCIParse ($conn, $sql_string3);
OCIExecute($stmnt);
for($i=0 ;$wert=OCIFetchinto($stmnt,&$row); $i++)
{
$c = $row[0];
}

// ||beginn ende||

$sql_string4 ="select round(sum(months_between(projekt9_vertrag.vertragsende,projekt9_vertrag.vertragsbeginn)*projekt9_vertragsart.monatsbeitrag),0)
from projekt9_vertrag, projekt9_vertragsart, projekt9_kunde, dual
where projekt9_vertragsart.id_vertragsart=projekt9_vertrag.id_vertragsart
and projekt9_kunde.id_kunde = projekt9_vertrag.id_kunde
and projekt9_vertrag.vertragsbeginn >= ‚$vbeg‘
and projekt9_vertrag.vertragsende