With some transactions monthly, and budget annually, there hs to be some method to spread he budget "per month". Also to ensure all sub categories and all months are reported create a "Cartesian product" of those, then left join the data to that. Finally in addition you need to include a way to sort the data sensibly. I hope that from this example you can adapt it to your specific needs.
SQL Fiddle
MySQL 5.6 Schema Setup:
-- Create transaktioner
CREATE TABLE transaktioner
(`id` varchar(4),
`datum` date,
`beskrivning` varchar(8),
`overforing` varchar(8),
`belopp` varchar(8),
`balans` varchar(8),
`subkat_id` varchar(8),
`konto_id` varchar(8)
);
INSERT INTO transaktioner
( `datum`,`beskrivning`,`overforing`,`belopp`,`balans`,`subkat_id`,`konto_id`)
VALUES
("2017-01-01","Test1","Yes",'1000','1200','1','1111'),
("2016-01-01","Test1","Yes",'1000','1200','2','1111');
-- Create Kategori Table
CREATE TABLE kategori
(`kat_id` varchar(4),`kat_namn` varchar(10));
INSERT INTO kategori
( `kat_id`,`kat_namn`)
VALUES
('1',"Kat1"),
('2',"Kat2"),
('3',"Kat3"),
('4',"Kat4");
-- Create Subkategori Table
CREATE TABLE subkategori
(`subkat_id` varchar(4),`kat_id` varchar(4),`subkat_namn` varchar(10));
INSERT INTO subkategori
( `subkat_id`,`kat_id`,`subkat_namn`)
VALUES
('1','1',"subKat1"),
('2','1',"subKat2"),
('3','1',"subKat3"),
('4','1',"subKat4");
-- Create budget Table
CREATE TABLE budget
(`budget_id` varchar(4),`subkat_id` varchar(4),`budgetedAmmount` varchar(10), `year` varchar(4));
INSERT INTO budget
( `budget_id`,`subkat_id`,`budgetedAmmount`,`year`)
VALUES
('1','1',"111",'2017'),
('2','2',"222",'2017'),
('3','3',"333",'2017'),
('4','4',"444",'2017'),
('1','1',"111",'2016'),
('2','2',"222",'2016'),
('3','3',"333",'2016'),
('4','4',"444",'2016');
Query 1:
SELECT
IFNULL(Year, 'All') AS Year
, IFNULL(Month, 'All') AS Month
, IFNULL(Kategori,'All') AS Kategori
, IFNULL(Subkategori,'All') AS Subkategori
, IFNULL(Belopp,0) AS Belopp
, IFNULL(Budget,0) AS Budget
FROM (
SELECT
y.year AS year
, m.n AS month
, kategori.kat_namn AS kategori
, subkategori.subkat_namn AS subkategori
, SUM(IFNULL(transaktioner.belopp,0)) AS belopp
, SUM(IFNULL(b.budgetedAmmount,0)) AS budget
FROM subkategori
INNER JOIN kategori ON subkategori.kat_id = kategori.kat_id
CROSS JOIN (
SELECT 2017 year
) y
CROSS JOIN (
SELECT 1 n union all SELECT 2 n union all SELECT 3 n union all SELECT 4 n union all
SELECT 5 n union all SELECT 6 n union all SELECT 7 n union all SELECT 8 n union all
SELECT 9 n union all SELECT 10 union all SELECT 11 union all SELECT 12
) m
LEFT JOIN transaktioner ON subkategori.subkat_id = transaktioner.subkat_id
AND y.year = YEAR(transaktioner.datum)
AND m.n = MONTH(transaktioner.datum)
LEFT JOIN (
SELECT subkat_id, Year, budgetedAmmount/12 as budgetedAmmount
FROM budget
) b ON subkategori.subkat_id = b.subkat_id
AND y.year = b.year
GROUP BY
y.year
, m.n
, kategori.kat_namn
, subkategori.subkat_namn
WITH ROLLUP
) d
ORDER BY
IFNULL(Year, 9999)
, IFNULL(Month, 13)
, IFNULL(Kategori,'zzzzzzzzz')
, IFNULL(Subkategori,'zzzzzzzzzzz')
;
Results:
| Year | Month | Kategori | Subkategori | Belopp | Budget |
|------|-------|----------|-------------|--------|--------|
| 2017 | 1 | Kat1 | subKat1 | 1000 | 9.25 |
| 2017 | 1 | Kat1 | subKat2 | 0 | 18.5 |
| 2017 | 1 | Kat1 | subKat3 | 0 | 27.75 |
| 2017 | 1 | Kat1 | subKat4 | 0 | 37 |
| 2017 | 1 | Kat1 | All | 1000 | 92.5 |
| 2017 | 1 | All | All | 1000 | 92.5 |
| 2017 | 2 | Kat1 | subKat1 | 0 | 9.25 |
| 2017 | 2 | Kat1 | subKat2 | 0 | 18.5 |
| 2017 | 2 | Kat1 | subKat3 | 0 | 27.75 |
| 2017 | 2 | Kat1 | subKat4 | 0 | 37 |
| 2017 | 2 | Kat1 | All | 0 | 92.5 |
| 2017 | 2 | All | All | 0 | 92.5 |
| 2017 | 3 | Kat1 | subKat1 | 0 | 9.25 |
| 2017 | 3 | Kat1 | subKat2 | 0 | 18.5 |
| 2017 | 3 | Kat1 | subKat3 | 0 | 27.75 |
| 2017 | 3 | Kat1 | subKat4 | 0 | 37 |
| 2017 | 3 | Kat1 | All | 0 | 92.5 |
| 2017 | 3 | All | All | 0 | 92.5 |
| 2017 | 4 | Kat1 | subKat1 | 0 | 9.25 |
| 2017 | 4 | Kat1 | subKat2 | 0 | 18.5 |
| 2017 | 4 | Kat1 | subKat3 | 0 | 27.75 |
| 2017 | 4 | Kat1 | subKat4 | 0 | 37 |
| 2017 | 4 | Kat1 | All | 0 | 92.5 |
| 2017 | 4 | All | All | 0 | 92.5 |
| 2017 | 5 | Kat1 | subKat1 | 0 | 9.25 |
| 2017 | 5 | Kat1 | subKat2 | 0 | 18.5 |
| 2017 | 5 | Kat1 | subKat3 | 0 | 27.75 |
| 2017 | 5 | Kat1 | subKat4 | 0 | 37 |
| 2017 | 5 | Kat1 | All | 0 | 92.5 |
| 2017 | 5 | All | All | 0 | 92.5 |
| 2017 | 6 | Kat1 | subKat1 | 0 | 9.25 |
| 2017 | 6 | Kat1 | subKat2 | 0 | 18.5 |
| 2017 | 6 | Kat1 | subKat3 | 0 | 27.75 |
| 2017 | 6 | Kat1 | subKat4 | 0 | 37 |
| 2017 | 6 | Kat1 | All | 0 | 92.5 |
| 2017 | 6 | All | All | 0 | 92.5 |
| 2017 | 7 | Kat1 | subKat1 | 0 | 9.25 |
| 2017 | 7 | Kat1 | subKat2 | 0 | 18.5 |
| 2017 | 7 | Kat1 | subKat3 | 0 | 27.75 |
| 2017 | 7 | Kat1 | subKat4 | 0 | 37 |
| 2017 | 7 | Kat1 | All | 0 | 92.5 |
| 2017 | 7 | All | All | 0 | 92.5 |
| 2017 | 8 | Kat1 | subKat1 | 0 | 9.25 |
| 2017 | 8 | Kat1 | subKat2 | 0 | 18.5 |
| 2017 | 8 | Kat1 | subKat3 | 0 | 27.75 |
| 2017 | 8 | Kat1 | subKat4 | 0 | 37 |
| 2017 | 8 | Kat1 | All | 0 | 92.5 |
| 2017 | 8 | All | All | 0 | 92.5 |
| 2017 | 9 | Kat1 | subKat1 | 0 | 9.25 |
| 2017 | 9 | Kat1 | subKat2 | 0 | 18.5 |
| 2017 | 9 | Kat1 | subKat3 | 0 | 27.75 |
| 2017 | 9 | Kat1 | subKat4 | 0 | 37 |
| 2017 | 9 | Kat1 | All | 0 | 92.5 |
| 2017 | 9 | All | All | 0 | 92.5 |
| 2017 | 10 | Kat1 | subKat1 | 0 | 9.25 |
| 2017 | 10 | Kat1 | subKat2 | 0 | 18.5 |
| 2017 | 10 | Kat1 | subKat3 | 0 | 27.75 |
| 2017 | 10 | Kat1 | subKat4 | 0 | 37 |
| 2017 | 10 | Kat1 | All | 0 | 92.5 |
| 2017 | 10 | All | All | 0 | 92.5 |
| 2017 | 11 | Kat1 | subKat1 | 0 | 9.25 |
| 2017 | 11 | Kat1 | subKat2 | 0 | 18.5 |
| 2017 | 11 | Kat1 | subKat3 | 0 | 27.75 |
| 2017 | 11 | Kat1 | subKat4 | 0 | 37 |
| 2017 | 11 | Kat1 | All | 0 | 92.5 |
| 2017 | 11 | All | All | 0 | 92.5 |
| 2017 | 12 | Kat1 | subKat1 | 0 | 9.25 |
| 2017 | 12 | Kat1 | subKat2 | 0 | 18.5 |
| 2017 | 12 | Kat1 | subKat3 | 0 | 27.75 |
| 2017 | 12 | Kat1 | subKat4 | 0 | 37 |
| 2017 | 12 | Kat1 | All | 0 | 92.5 |
| 2017 | 12 | All | All | 0 | 92.5 |
| 2017 | All | All | All | 1000 | 1110 |
| All | All | All | All | 1000 | 1110 |