[sql] 4 tabellen 2x groupby?

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

- wes  -

- wes -

31/07/2007 14:25:00
Quote Anchor link
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:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
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:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
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
<?
$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
Gewijzigd op 01/01/1970 01:00:00 door - wes -
 
PHP hulp

PHP hulp

08/02/2023 14:07:36
 
Hipska BE

Hipska BE

31/07/2007 14:32:00
Quote Anchor link
ik zou eens leren werken met JOIN's
 
- wes  -

- wes -

31/07/2007 14:34:00
Quote Anchor link
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.
Gewijzigd op 01/01/1970 01:00:00 door - wes -
 
PHP erik

PHP erik

31/07/2007 14:36:00
Quote Anchor link
@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


@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?

Code (php)
PHP script in nieuw venster Selecteer het PHP script
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
<?
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:
Bij nader inzien denk ik niet dat bovenstaande query gaat werken aangezien je natuurlijk gewoon elke datum langs wil gaan
Gewijzigd op 01/01/1970 01:00:00 door PHP erik
 
Frank -

Frank -

31/07/2007 14:40:00
Quote Anchor link
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:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
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
<?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.
Gewijzigd op 01/01/1970 01:00:00 door Frank -
 
- wes  -

- wes -

31/07/2007 14:50:00
Quote Anchor link
zonder () om de groupby , maar voor de rest precies wat ik wil!

tnx frank erik!
 
PHP erik

PHP erik

31/07/2007 14:52:00
Quote Anchor link
Ik heb 'm gemaakt zoals ik denk dat ie misschien correct is. En ik zie dat ie behoorlijk veel op die van Frank lijkt.

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
<?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
Gewijzigd op 01/01/1970 01:00:00 door PHP erik
 
Frank -

Frank -

31/07/2007 14:55:00
Quote Anchor link
@PHPerik: Jouw query gaat de fout in zodra er meerdere jaren in de database staan. Je GROUPt namelijk alleen op de maand...
 
PHP erik

PHP erik

31/07/2007 14:57:00
Quote Anchor link
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.
Gewijzigd op 01/01/1970 01:00:00 door PHP erik
 
- wes  -

- wes -

31/07/2007 15:10:00
Quote Anchor link
je bent altijd al een beetje vergeetachtig erik

ik ben btw wes en die boven je is frank
 
PHP erik

PHP erik

31/07/2007 15:19:00
Quote Anchor link
:'(
 



Overzicht Reageren

 
 

Om de gebruiksvriendelijkheid van onze website en diensten te optimaliseren maken wij gebruik van cookies. Deze cookies gebruiken wij voor functionaliteiten, analytische gegevens en marketing doeleinden. U vindt meer informatie in onze privacy statement.