In meinen Tabellen habe ich selten eine 'Abteilung', sondern eigentlich immer nur einen FK auf eine separate Tabelle 'Abteilungen', das ist ja normal. Ergo habe ich bereits eine Tabelle aller Abteilungen.
Weiterhin habe ich 'Auswertungsgruppen'. Dort lege ich ab, welche Abteilungen (Produkte, Personen, egal) zusammengefasst werden sollen. So habe ich z.B. eine Auswertungsgruppe 'Alle aktiven Abteilungen', oder 'Meine Top-Produkte' oder 'Personen aus dem 3.Stock'.
Nun kann ich über diese Gruppen beliebige Auswertungen fahren, sodaß immer alle Mitglieder dieser Gruppe in den Auswertungen auftauchen, auch wenn noch keine Daten angefallen sind.
Code:
select A.Name,
coalesce (sum (d.Irgendwas), 0) as Ergebnis
from Abteilungsgruppe Ag
join Abteilung A on Ag.AbteilungsID = A.ID
left join Daten d on d.AbteilungsID = A.ID
where d.Datum between :Start and :Ende
and Ag.ID = 23 -- 23 sei jetzt mal die GruppenID der Gruppe 'Alle aktiven Abteilungen'
Und nun kann ich einfach den Zeitraum und die Auswertungsgruppe parametrieren und dann habe ich einen Report, der mir für jeden beliebigen Zeitraum und jede beliebige Abteilungsgruppe eine Auswertung liefert.
Über Trigger in der Auswertungsgruppe kann ich zudem steuern, ob (und ggf das) eine Abteilung nur in einer Gruppe sein darf oder nicht.
Wenn ich dieses Pattern auf alle meine Daten lege, stellen sich mir diese Fragen hier gar nicht mehr, weil alle meine Reports automatisch schon all das anzeigen, was gewünscht ist. Und da die Auswertungsgruppen vom Kunden editierbar sind, kann er sich seine Abteilungsauswertungen auch beliebig zusammenstellen. Und ja: Natürlich gibt es noch Auswertungen je Tag und über alle Gruppen (Achtung! Wenn Gruppen nicht disjunkt sind, stimmt die Summe nicht).