Berechnung in Abfragen trotz leerer Felder

Hallo zusammen!

Ich habe eine Abfrage über mehrere Tabellen laufen. In all diesen Tabellen gibt es u.a. denselben Fremdschlüssel und das Feld Quadratmeter. Ich möchte die Summe aller Quadratmeter eines Fremdschlüssels ermitteln. Das funktioniert aber nur soweit es für den Fremdschlüssel in jeder dieser Tabelllen einen Datensatz gibt, was nicht immer der Fall ist. Access schmeisst mir dann alle Fremdschlüssel aus der Abfrage, die in einer der Tabellen keinen Datensatz haben. Das find ich gar nicht gut. Kann ich ihm ohne VBA sagen, nimm Null als Summand, wenn der Fremdschlüssel nicht in der Tabelle vorhanden ist?

Vielen Dank im Voraus und freundliche Grüsse
N. Edelmann

Oha, das höhrt sich fast nach einem Kozeptionsfehler des
Datenbankmodels an. Es darf eigentlich keinen FK ohne
zugehörigen Datensatz geben --> Referentielle Integrität.

Wenn Du einen FK in einer Tabelle hast zu der es in der
Untertabelle keine Tupel gibt, musst Du zuerst den Count der
Tabelle erfragen. Wenn dieser int 0 ist, musst Du Quadratmeter
auf int 0 setzen, ansonsten in einem zweiten Schritt die Summe
des Feldes Quadratmeter holen. Also VBA. Aber das ist jetzt
ein wenig wahge daher geredet da ich das db-Modell nicht
kenne.

Gebe mal mehr Info.

Gruß Martin

Hallo zusammen!

Ich habe eine Abfrage über mehrere Tabellen laufen. In all
diesen Tabellen gibt es u.a. denselben Fremdschlüssel und das
Feld Quadratmeter. Ich möchte die Summe aller Quadratmeter
eines Fremdschlüssels ermitteln. Das funktioniert aber nur
soweit es für den Fremdschlüssel in jeder dieser Tabelllen
einen Datensatz gibt, was nicht immer der Fall ist. Access
schmeisst mir dann alle Fremdschlüssel aus der Abfrage, die

in

einer der Tabellen keinen Datensatz haben. Das find ich gar
nicht gut. Kann ich ihm ohne VBA sagen, nimm Null als

Summand,

wenn der Fremdschlüssel nicht in der Tabelle vorhanden ist?

Vielen Dank im Voraus und freundliche Grüsse
N. Edelmann

Hallo!
Erstmal vielen Dank Martin!

Es gibt den FK in der Tabelle natürlich nicht, wenn kein Datensatz vorhanden ist. Aber das Feld FK ist in allen Tabellen vorgesehen.

Bei der Datenbank handelt es sich um eine Art Immobilienverwaltung. Es gibt die Tabelle Wohnung (PK idWhg) und mehrere Untertabellen mit den verschiedenen Raumkategorien (Küche, Bad, Aussenanlagen usw.) jeweils mit FK fidWhg und m2. Für alle Räume der Wohnung möchte ich die Summe der m2. Zu manchen Wohnungen gibt es z.B. keinen Balkon (=Aussenanlage). Dann funktioniert die Summenbildung nicht, weil er dann alle Daten zu dieser fidWhg rausschmeisst. Mit VBA könnte ich das zwar hinbekommen, nur mag mein Chef kein VBA. Er möchte das über eine SQL Abfrage, damit es auch für VB-Ahnungslose später nachvollziehbar ist.

Kann nich nicht irgendwie sagen WHERE fidWhg NOT da:smile:, nimm null als Summand?

Gruss
Nadja

Wenn dir das hilft, hier die bisherige SQL-Abfrage. Sorry, ist etwas lang:

SELECT tdatWhg.idWhgMutation, tdatKueche.dtM2 AS dtM2Kueche, qNasszellenAnzahlSummeM2undRE.cptSummeM2 AS cptSummeM2Nasszellen, qWohnraumAnzahlSummeM2undRE.cptSummeM2 AS cptSummeM2Wohnraum, qAussenAnzahlSummeM2undRE.cptSummeM2 AS cptSummeM2Aussen, qSonstRaumAnzahlSummeM2undRE.cptSummeM2 AS cptSummeM2SonstRaum, [tdatKueche]![dtM2]+[qNasszellenAnzahlSummeM2undRE]![cptSummeM2]+[qWohnraumAnzahlSummeM2undRE]![cptSummeM2]+[qAussenAnzahlSummeM2undRE]![cptSummeM2]+[qSonstRaumAnzahlSummeM2undRE]![cptSummeM2] AS cptWhgSummeM2
FROM tdatKueche INNER JOIN ((((tdatWhg INNER JOIN qNasszellenAnzahlSummeM2undRE ON tdatWhg.idWhgMutation = qNasszellenAnzahlSummeM2undRE.idWhgMutation) INNER JOIN qWohnraumAnzahlSummeM2undRE ON tdatWhg.idWhgMutation = qWohnraumAnzahlSummeM2undRE.idWhgMutation) INNER JOIN qAussenAnzahlSummeM2undRE ON tdatWhg.idWhgMutation = qAussenAnzahlSummeM2undRE.idWhgMutation) INNER JOIN qSonstRaumAnzahlSummeM2undRE ON tdatWhg.idWhgMutation = qSonstRaumAnzahlSummeM2undRE.idWhgMutation) ON tdatKueche.fidWhgMutation = tdatWhg.idWhgMutation;

Hallo,
Mal auf die Schnelle:
Ohne das jetzt genau gelesen zu haben dünkt mich das was du brauchst ist die „Nz“-Funktion (NotZero).

Die funktioniert im Prinzip so (sowohl mit SQL als auch mit VBA), dass alle inhaltsleeren Felder auf 0 (statt leer) gesetzt werden.

…die Syntax ist:

statt:
Where [meinFeld]=irgendwas
Where Nz(meinFeld)=irgendwas

Will wissen obs geholfen hat

Viel Spass und Erfolg
Stefan

Hallo Stefan,

besten Dank für den Vorschlag. So leicht funktioniert es leider nicht, weil es für die FK gar keinen Datensatz gibt. Ich hatte es vorher schon so probiert. Aber vielleicht mache ich auch etwas falsch.

Gruss, Nadja

Hier eine kurze Syntax zu meinem Thema: Berechnung eines Ansatzes aus Gundansatz + Zuschlag (manche idWhg haben keinen Zuschlag)

SELECT qGrundansatz.idWhgMutation, qGrundansatz.dtGrundansatz, qStockwerkZuschlag.dtZuschlag, [qGrundansatz]![dtGrundansatz]+[qStockwerkZuschlag]![dtZuschlag] AS cptAnsatz
FROM qStockwerkZuschlag, qGrundansatz
WHERE Nz([qGrundansatz]![idWhgMutation])=[qStockwerkZuschlag]![idWhgMutation];

nu aber ??
OK,

Hier mal im Beispiel (gebaut und getestet!!):

Es gibt 3 Tabellen

  1. „tblWhg“ mit den Feldern „IDWhg“ (AutoWert und Primärschlüssel) und „NameWhg“(Textfeld)

  2. „tblZ1“ mit den Feldern „WhgID“ (Zahl) und „QmZ1“(Zahl)

  3. „tblBlk“ mit den Feldern „WhgID“ (Zahl) und „QmBlk“(Zahl)

Mal angenommen
a) in der 1ten Tabelle sind 5 Wohnungen nebst ihren Namen eingetragen.

b) in der 2ten Tabelle sind lediglich 4 Wohnungen aus Tabelle1 (WhgID) mit einer qm Angabe zu Zimmer1 (QmZ1)

c) in der 3ten Tabelle sind 2 Wohnungen aus Tabelle1 (WhgID) mit einer qm Angabe zum Balkon (QmBlk)

…dann zeigt die folgende (SQL) Abfrage eine Tabelle aller 5 Wohnungen nebst den Quadratmetern von Zimmer1 (bei 4 Datensätzen) und den Quadratmetern des Balkons (bei 2 Datensätzen) und der Summe der Quadratmeter aus Zimmer1 und Balkon (bei allen Datensätzen)

…schnipp…

SELECT tblWhg.NameWhg, tblZ1.QmZ1, tblBlk.QmBlk, Nz([QmZ1])+Nz([QmBlk]) AS Sum
FROM (tblWhg LEFT JOIN tblBlk ON tblWhg.IDWhg = tblBlk.WhgID) LEFT JOIN tblZ1 ON tblWhg.IDWhg = tblZ1.WhgID;

…schnapp…

nu aber ??? hilfts ??
noch Fragen ?

Viel Spass und Erfolg
Stefan

Hallo Stefan,

es hat geklappt! Ich dank dir herzlich und wie verrückt! Du bist mein Held.

Mein Fehler war der INNER JOIN. Ich hatte es vor einer Woche mal mit LEFT JOIN probiert, nur ohne Nz(). Da hat mir Access von allein immer einen INNER JOIN draus gemacht, weil ich es sicherlich falsch angeordnet hatte. Hab jetzt eine ganz neue Abfrage aufgebaut und nu kommt das raus was ich wollte. Super, spitzenmässig! Und das ganz ohne VBA :smile:

Viele Grüsse,
Nadja

Prima
Hallo Nadja

es hat geklappt! Ich dank dir herzlich und wie verrückt! Du
bist mein Held.

Na das geht ja runter wie Öl (*gg*), freut mich, dass es geklappt hat.
So macht w-w-w wirklich Spass !!

Stefan