Tabellen
orders
id
abo


fakturen
faktuurnr
datum (DATE)
order_id


faktuurregels
faktuurnr
omschrijving
prijs


abonnementen
id
abo_naam



Relaties:
fakturen.order_id = orders.id
orders.abo = abonnementen.id
fakturen.faktuurnr = faktuurregels.faktuurnr


Wat ik wil bereiken is een overzicht per MAAND van alle faktuurbedragen per ABONNEMENT.

Dus als volgt:

--
2007-07

Lite : 7853.80
Basic : 4648.78
Extra : 1359.03
--

of als sql result:

2007-07 | lite   | 12,98
2007-07 | basic  | 15,98
2007-07 | extra  | 12,97
2007-06 | lite   | 22,98
2007-06 | basic  | 42,18
2007-06 | extra  | 132,98
2007-05 | lite   | 12,98
2007-05 | basic  | 13,98
2007-05 | extra  | 98,93


Dat wil dus zeggen, in Juli 2007 is voor alle lite orders totaal 7853.80 euro omzet gemaakt.

Ik ben dr al een halve dag mee aant klooien maar ik krijg het niet voor elkaar in 1 query.
Kan dit in 1 query uberhaupt? Wie maakt me los..


Heb het nu in 2 querys als volgt:
<?
$sql_maanden = 'SELECT DISTINCT
f.datum
FROM
fakturen f
WHERE
f.order_id != "0"
ORDER BY
f.datum ASC';

$sql = 'SELECT
f.datum,
SUM(r.prijs) AS totaalprijs,
ab.abo_naam,
ab.id AS abo_id
FROM
fakturen f,
faktuurregels r,
orders a,
abonnementen ab
WHERE
r.faktuurnr = f.faktuurnr
AND
f.datum = "'.$row_maanden['datum'].'"
AND
f.order_id != "0"
AND
a.id = f.order_id
AND
a.abo = ab.id
GROUP BY
a.abo
ORDER BY
ab.id ASC';

?>

Maar das dus niets van wat ik wil bereiken. Ik zal dan bijv 2x een groupby moeten geven wat niet wil.

iemand suggesties / voorzetje

bvd

PS. NEEN ik kan de database layout niet wijzigen
ik zou eens leren werken met JOIN's
Hipska, leuk, maar dat vroeg ik niet. Ben je een blijer mens als het in JOINS gaat?

okidoki dan, toevoeging, een voorzetje is zeer welkom, maar wel met JOINS.
@Hipska
Als je nog een keer goed kijkt dan zie je dat hij al JOINs gebruikt.
[edit]tabel1.column en tabel2.column is ook een JOIN[/edit]

@Wes
Ik heb me niet verdiept in je tabellen, want ik ben net wakker en dus lui, maar als die 2 queries werken, dan kun je er ook gewoon een subquery van maken en IN gebruiken, toch?

<?
SELECT
f.datum,
SUM(r.prijs) AS totaalprijs,
ab.abo_naam,
ab.id AS abo_id
FROM
fakturen f,
faktuurregels r,
orders a,
abonnementen ab
WHERE
r.faktuurnr = f.faktuurnr
AND
f.datum IN ( SELECT DISTINCT
f.datum
FROM
fakturen f
WHERE
f.order_id != "0"
ORDER BY
f.datum ASC )
AND
f.order_id != "0"
AND
a.id = f.order_id
AND
a.abo = ab.id
GROUP BY
a.abo
ORDER BY
ab.id ASC
?>

[edit]Het is misschien een beetje vieze oplossing maar het zal wel een stuk sneller zijn dan een PHP oplossing. Ik kijk zo wel of ik het in een mooie query kan doen.[/edit]

[edit]Bij nader inzien denk ik niet dat bovenstaande query gaat werken aangezien je natuurlijk gewoon elke datum langs wil gaan[/edit]
De eerste query kan weg, die voegt niets toe, staat alleen maar in de weg.

De tweede query heeft wat extra's nodig, de GROUP BY moet je uitbreiden met alle gegevens die je opvraagt (behalve r.prijs, die staat namelijk in de SUM) en de datum moet zijn het jaar + de maand.

Verder natuurlijk dubbele quotes gebruiken om de query en enkele quotes om een string in de query:
<?php
$sql = "SELECT
DATE_FORMAT(f.datum, '%Y-%m') AS jaarmaand,
SUM(r.prijs) AS totaalprijs,
ab.abo_naam,
ab.id AS abo_id
FROM
fakturen f,
faktuurregels r,
orders a,
abonnementen ab
WHERE
r.faktuurnr = f.faktuurnr
AND
f.order_id != '0'
AND
a.id = f.order_id
AND
a.abo = ab.id
GROUP BY
a.abo, ab.abo_naam, DATE_FORMAT(f.datum, '%Y-%m')
ORDER BY
f.datum ASC,
ab.id ASC";
?>
Niet getest, dus garantie tot aan de deur!

Edit: Haakjes verwijderd, query werkt nu goed.
zonder () om de groupby , maar voor de rest precies wat ik wil!

tnx frank erik!
Ik heb 'm gemaakt zoals ik denk dat ie misschien correct is. En ik zie dat ie behoorlijk veel op die van Frank lijkt.

<?php
SELECT
MONTH(b.datum) AS maand,
SUM(c.prijs) AS maandtotaal,
d.abo_naam
FROM
orders AS a,
fakturen AS b,
faktuurregels AS c,
abonnementen AS d
WHERE
a.abo = d.id
AND
a.id = b.order_id
AND
b.faktuurnummer = c.faktuurnummer
AND
b.order_id <> 0
GROUP BY
d.id, MONTH(b.datum)
ORDER BY
b.datum
DESC
?>

[edit]Te laat[/edit]
@PHPerik: Jouw query gaat de fout in zodra er meerdere jaren in de database staan. Je GROUPt namelijk alleen op de maand...
Je hebt gelijk ja. Beetje dom van me, zeker aangezien ik 2 weken terug nog dezelfde soort situatie had en toen wel rekening heb gehouden met jaren. Thanks.
je bent altijd al een beetje vergeetachtig erik

ik ben btw wes en die boven je is frank

Reageren