- ivar
- Medlem ●
- Stockholm
- 2004-09-13 22:59
Håller på med ett ekonomisystem där en användare registerar kategorier och transaktioner (tillhörandes en kategori).
Nu är det som så att jag vill, dels av nyfikenhet, skriva en SQL-sats som tar fram statistik så jag kan kladda upp lite HTML som berättar hur mycket man gjort av med per kategori och månad (och år).
En transaktion innehåller bland annat
-en ägare (heltal, pekar ut en ur users-tabellen)
-ett 'amount' dvs antal kronor som transaktionen är på
-en kategori som transaktionen ska grupperas under (heltal, pekar ut en ur categories-tabellen)
-ett datum som säger när transaktionen gjordes (performed)
Vad SQL-frågan ska ta fram är (grupperat per månad och år)
- inkomster, utgifter för varje kategori.
Lite kriterier:
- Om inga utgifter eller inkomster finns för en kategori så behöver den kategorin inte visas
- Om utgifter finns men inte inkomster så ska inkomster innehålla värdet 0 (och vice versa)
I dagsläget har jag 3st selectsatser som jag alltså vill slå ihop till en.
Denna tar fram summan av samtliga utgifter, grupperat efter år och månad
$sql_1 = " SELECT SUM(ABS(t." . TABLE_TRANSACTIONS_AMOUNT . ")) AS total, YEAR(FROM_UNIXTIME(t." . TABLE_TRANSACTIONS_PERFORMED . ", '%Y-%m-%d')) AS year, MONTH(FROM_UNIXTIME(t." . TABLE_TRANSACTIONS_PERFORMED . ", '%Y-%m-%d')) AS month, t." . TABLE_TRANSACTIONS_PERFORMED . " FROM " . TABLE_TRANSACTIONS . " t WHERE t." . TABLE_TRANSACTIONS_OWNER . " = '" . $user_id . "' AND (t." . TABLE_TRANSACTIONS_AMOUNT . " < 0 ) GROUP BY year DESC, month DESC ";
Den här körs för varje rad som hämtats i frågan åvan.
Den hämtar hem antalet transaktioner gjorda per kategori samt summerar hur mycket utgifter just den kategorin stod för den månaden (och året).
$sql_2=" SELECT c." . TABLE_CATEGORIES_TITLE . ", c.id, SUM(ABS(t." . TABLE_TRANSACTIONS_AMOUNT . ")) AS total, COUNT(*) AS num FROM " . TABLE_TRANSACTIONS . " t, " . TABLE_CATEGORIES . " c WHERE t." . TABLE_TRANSACTIONS_OWNER . " = '" . $user_id . "' AND YEAR(FROM_UNIXTIME(t." . TABLE_TRANSACTIONS_PERFORMED . ", '%Y-%m-%d')) = " . $year . " AND MONTH(FROM_UNIXTIME(t." . TABLE_TRANSACTIONS_PERFORMED . ", '%Y-%m-%d')) = " . $month . " AND (t.amount < 0 ) AND c.id = t.category_id GROUP BY c." . TABLE_CATEGORIES_TITLE . " ";
Sedan kommer en likadan 3dje SQL-sats fast med skillnaden att den hämtar inkomsterna för kategorierna.
HTML-koden blir väldigt mycket lättare att kladda upp om all datat finns direkt på samma rad i resultatet.
Dessutom, vilket är bäst: Att skicka 4-5st förfrågningar till databasen eller skriva en lite tyngre select-sats?? Jag försöker designa systemet för större skala, säg flera hundra användare samtidigt.
mvh
ivar