Door
Brecht S
op 20-01-2015 18:20
gewijzigd op 21-01-2015 16:58
2.046 views
Ik heb een tabel genaamd accountics in mijn database:
ID Betaald Betaald_op betaald_in_maand Bedrijfsnaam Bedrag Recurrent Categorie
1 ja 2015-11-10 november Bedrijf1 100 nee IT materiaal
2 nee Bedrijf2 50 nee Software
3 ja 2014-12-20 december Bedrijf3 250 ja Mobiele kosten
En een tabel genaamd lijst_accountics_categorie:
ID naam
1 Restaurant
2 Mobiele kosten
3 Software
4 IT materiaal
De relatie tussen beide tabellen zit in de categorie (tabel accountics) en de naam (tabel lijst_accountics_categorie).
Wat ik nu wil is een overzichtlijst zoals hieronder:
Code jan feb mrt apr mei jun jul aug sep okt nov dec
Recurrent gedeelte
Mobiele kosten 250
Eenmalig gedeelte
IT-materiaal 100
De namen 'recurrent gedeelte' en 'eenmalig gedeelte' komt uit de selectie in de accountics tabel of het recurrent is of niet. Bvb: recurrent=ja => moet bij recurrent gedeelte gevoegd worden, recurrent=nee => moet bij eenmalig gedeelte gevoegd worden.
Kosten die nog niet betaald zijn (betaald = nee) moeten niet in de lijsten verschijnen.
Zijn er meerdere kosten in dezelfde maand onder dezelfde categorie worden die gewoon samengeteld voor die maand.
Momenteel heb ik al het volgende gedaan:
SELECT
SUM(totaal_incl) as tot_be_jan
FROM
accountics a
JOIN
lijst_accountics_categorie lc
ON
a.categorie = lc.naam
WHERE a.betaald_in_maand = 'januari'
En dit doe ik per maand
Daaronder doe ik dan de volgende query:
SELECT
a.categorie
FROM
accountics a
JOIN
lijst_accountics_categorie lc
ON
a.categorie = lc.naam
WHERE a.recurrent = 'nee'
Hieronder komt dan de html tabel te staan. Waarschijnlijk kunnen deze beiden in 1 query uitgevoerd worden. Dan moet er nog een opsplitsing gebeuren van dat recurrent en eenmalig gedeelte ook. Ook de totalen zijn niet juist opgeteld hiermee. Alles wat in de maand januari staat bvb is samen opgeslagen maar niet per categorie wat dus ook niet juist is.
Op de eerste plaats begrijp ik niet waarom je de tabel categorie hebt. Het zou logischer zijn geweest om in accountics ipv de categorie naam de categorie id te hebben opgeslagen (bijv 1 ipv Restaurant).
Bedenk maar eens wat je nu moet doen als je Restaurant wilt wijzigen Cafetaria.
Volgens mij hoef je ook geen aparte query per maand te doen, je kunt dat ook in 1 query doen die 12 maandkolommen teruggeeft.
Bijv. iets als:
SELECT
Recurrent,
Categorie,
SUM(CASE WHEN betaald_in_maand = 'januari' THEN totaal_inc ELSE 0) as januari,
SUM(CASE WHEN betaald_in_maand = 'februari' THEN totaal_inc ELSE 0) as februari,
... de andere maanden ...
SUM(CASE WHEN betaald_in_maand = 'december' THEN totaal_inc ELSE 0) as december
GROUP BY
Recurrent,
Categorie
ORDER BY
Recurrent,
Categorie
Met deze uitkomst, moet je de HTML makkelijk kunnen opmaken.
Ik heb het niet getest, maar uit mijn hoofd ingetikt. Misschien moet de CASE wat anders.
Je hebt mijn vraag begrepen, Jan ;-)
Alleen is er bij jou geen rekening gehouden met de splitsing tussen eenmalig en recurrent, maar dat heb ik ondertussen anders opgelost.
Er waren enkele foutjes in je query (je had het al aangegeven, maar ik heb het aangepast).
Voor het gedeelte waar 'eenmalig' moet gekozen worden:
SELECT
recurrent,
categorie,
SUM(CASE WHEN betaald_in_maand = 'januari' THEN totaal_incl ELSE 0 END) as tot_jan,
SUM(CASE WHEN betaald_in_maand = 'februari' THEN totaal_incl ELSE 0 END) as tot_feb,
SUM(CASE WHEN betaald_in_maand = 'maart' THEN totaal_incl ELSE 0 END) as tot_mrt,
SUM(CASE WHEN betaald_in_maand = 'april' THEN totaal_incl ELSE 0 END) as tot_apr,
SUM(CASE WHEN betaald_in_maand = 'mei' THEN totaal_incl ELSE 0 END) as tot_mei,
SUM(CASE WHEN betaald_in_maand = 'juni' THEN totaal_incl ELSE 0 END) as tot_jun,
SUM(CASE WHEN betaald_in_maand = 'juli' THEN totaal_incl ELSE 0 END) as tot_jul,
SUM(CASE WHEN betaald_in_maand = 'augustus' THEN totaal_incl ELSE 0 END) as tot_aug,
SUM(CASE WHEN betaald_in_maand = 'september' THEN totaal_incl ELSE 0 END) as tot_sep,
SUM(CASE WHEN betaald_in_maand = 'oktober' THEN totaal_incl ELSE 0 END) as tot_okt,
SUM(CASE WHEN betaald_in_maand = 'november' THEN totaal_incl ELSE 0 END) as tot_nov,
SUM(CASE WHEN betaald_in_maand = 'december' THEN totaal_incl ELSE 0 END) as tot_dec
FROM
accountics
WHERE
recurrent = 'nee'
GROUP BY
recurrent, categorie
ORDER BY
recurrent, categorie
Voor het gedeelte waar 'recurrent' moet gekozen worden:
SELECT
recurrent,
categorie,
SUM(CASE WHEN betaald_in_maand = 'januari' THEN totaal_incl ELSE 0 END) as tot_jan,
SUM(CASE WHEN betaald_in_maand = 'februari' THEN totaal_incl ELSE 0 END) as tot_feb,
SUM(CASE WHEN betaald_in_maand = 'maart' THEN totaal_incl ELSE 0 END) as tot_mrt,
SUM(CASE WHEN betaald_in_maand = 'april' THEN totaal_incl ELSE 0 END) as tot_apr,
SUM(CASE WHEN betaald_in_maand = 'mei' THEN totaal_incl ELSE 0 END) as tot_mei,
SUM(CASE WHEN betaald_in_maand = 'juni' THEN totaal_incl ELSE 0 END) as tot_jun,
SUM(CASE WHEN betaald_in_maand = 'juli' THEN totaal_incl ELSE 0 END) as tot_jul,
SUM(CASE WHEN betaald_in_maand = 'augustus' THEN totaal_incl ELSE 0 END) as tot_aug,
SUM(CASE WHEN betaald_in_maand = 'september' THEN totaal_incl ELSE 0 END) as tot_sep,
SUM(CASE WHEN betaald_in_maand = 'oktober' THEN totaal_incl ELSE 0 END) as tot_okt,
SUM(CASE WHEN betaald_in_maand = 'november' THEN totaal_incl ELSE 0 END) as tot_nov,
SUM(CASE WHEN betaald_in_maand = 'december' THEN totaal_incl ELSE 0 END) as tot_dec
FROM
accountics
WHERE
recurrent = 'ja'
GROUP BY
recurrent, categorie
ORDER BY
recurrent, categorie
Voor wat betreft je opmerking/tip: je hebt helemaal gelijk. Ik moet het ID opslaan van de categorie horende bij de lijst_accountics_categorie in de tabel accountics i.p.v. de naam. Ga ik ook nog aanpassen straks.
[size=xsmall]Toevoeging op 21/01/2015 17:34:54:[/size]
Ik hield rekening met recurrent en eenmalig door dat als group by op te nemen. Dat moet je in je verwerking dan wel uitsplitsen. Maar met 2 query's kan het ook.
Volgens mij zijn ze nu wel allebei hetzelfde.
Vwb je andere probleem: Ik heb daar een reactie gegeven, ik weet niet of het wel een Javascript probleem is.
@Ger: ik heb het wel vermeld op het forum dat het nog ergens anders gepost was ook, maar hier heb ik het eerst gepost en pas een dag later op het andere ;-)
Maar eigenlijk wil ik wel eens weten hoe jij die 2 queries aan elkaar zou koppelen met de UNION en waarom dan niet in 1 query? Of kan dit hier niet?
Ik vermoed dat Jan dezelfde vraag had als ik... Of het gaat over de UNION...
Het is naar de database server één query met daarin twee SELECT statements.
En ik bedoel letterlijk aan elkaar plakken, want je vervangt in jouw eerste query de ORDER BY (die daar overigens geen zin heeft) door UNION en dan kopieer en plak je de tweede query daarachter.
En het kan ook in één query zoals (ik denk dat) jij het ziet maar dan krijg je de maanden in rijen.