Count

Nabend!

Wenn Count entwas zählt, was aber gar nicht da ist, dann gibt Count nichts zurück. Ich meine, ich erhalte keine „0“. Das ist aber doof. Wie kann ich in einem Count-Befehl angeben, dass eine „0“ zurückgegeben werden soll, wenn keine entsprechenden Datensätze gefunden wurden?

Beispiel:
Es sollen auf mehreren HDDs die Ordner gezählt werden. Wenn aber kein Ordner vorhanden ist, wird die HDD gar nicht in der Abfage aufgeführt. Schön wäre aber, wenn eine HDD ohne Ordner ebenfalls aufgeführt würde, eben mit einer „0“ als Anzahl der gezählten Ordner.

SELECT [HDD].[HDD\_Name], Count([Daten].[Art]) AS Ordner
FROM HDD, Daten
WHERE [HDD].[HDD\_Name]=[Daten].[HDD\_Name] And [Daten].[Art]="Ordner"
GROUP BY [HDD].[HDD\_Name];

Danke für eure Hilfe.
Rogge

Mahlzeit wieder,

SELECT [HDD].[HDD_Name], Count([Daten].[Art]) AS Ordner
FROM HDD, Daten
WHERE [HDD].[HDD_Name]=[Daten].[HDD_Name] And
[Daten].[Art]=„Ordner“
GROUP BY [HDD].[HDD_Name];

uh… ich merke, ich muß ein bißchen nachdrücklicher mit meiner Anregung Nr. 2 werden: beschäftige Dich mit den Grundlagen!

Das, was Dir auffällt, nennt man einen Outer Join. Ein Inner Join bildet immer „Pärchen“ zweier Attribute, die in beiden Tabellen gleich sind. Wie Du schon erkannt hast, werden nur solche gebildet, bei denen es rechts und links Vorkommen gibt. Alle anderen werden unterdrückt.

Beim Outer Join werden auch die Datensätze „verpaart“, bei denen nur links (oder nur rechts, je nach Join) ein Merkmal vorhanden ist; das zweite Merkmal wird dann mit NULL angegeben. In Deinem Fall willst Du also auch Datensätze anzeigen, bei denen die Festplatte existiert, aber keine zugeordneten Ordner.

Das Ganze sieht dann in etwa so aus::

SELECT [HDD].[HDD\_Name], Count([Daten].[Art]) AS Ordner
 FROM HDD LEFT JOIN Daten
 ON [HDD].[HDD\_Name]=[Daten].[HDD\_Name] 
 WHERE [Daten].[Art]="Ordner"
 GROUP BY [HDD].[HDD\_Name];

Nimms mir nicht übel, aber ich rate Dir dringend: beschäftige Dich mit SQL und dem relationalen Modell allgemein! Hol Dir ein Buch und lies es durch. Am besten keins über Access, sondern ein reines SQL-Buch. Meine persönliche Empfehlung wäre Wolfgang Misgelds SQL-Werk http://hugendubel.de/cat/sql_einstieg_und_anwendung_… Buch anschauen.aspx - erst im zweiten Schritt solltest Du ein spezielles Access-Buch durcharbeiten.

Gruß

Sancho

Guten Morgen!

Das Ganze sieht dann in etwa so aus::

SELECT [HDD].[HDD_Name], Count([Daten].[Art]) AS Ordner
FROM HDD LEFT JOIN Daten
ON [HDD].[HDD_Name]=[Daten].[HDD_Name]
WHERE [Daten].[Art]=„Ordner“
GROUP BY [HDD].[HDD_Name];

Das habe ich so übernommen. Sieht auch richtig aus, und ich habe mich vorher mit dem Thema „Join“ beschäftigt. Trotzdem klappt das nicht. Ich erhalte gar keine Daten. Das Abfrageergebnis ist völlig leer. Dabei sollten doch zumindest die Namen der HDDs angezeigt werden…

Nimms mir nicht übel, aber ich rate Dir dringend: beschäftige
Dich mit SQL und dem relationalen Modell allgemein! Hol Dir
ein Buch und lies es durch.

Ja ich weiß, ich arbeite dran. Doch geht es schneller und ist es einfacher eine Frage hier zu stellen, als ein ganzes Buch durchzulesen :wink:

MfG
Rogge

Mahlzeit,

jajaja - ich merke, ich hab an anderer Stelle Probleme - ich müßte mein Hirn einschalten, bevor ich poste :smile:

Das Ganze sieht dann in etwa so aus::

SELECT [HDD].[HDD_Name], Count([Daten].[Art]) AS Ordner
FROM HDD LEFT JOIN Daten
ON [HDD].[HDD_Name]=[Daten].[HDD_Name]
WHERE [Daten].[Art]=„Ordner“
GROUP BY [HDD].[HDD_Name];

Das habe ich so übernommen. Sieht auch richtig aus, und ich
habe mich vorher mit dem Thema „Join“ beschäftigt. Trotzdem
klappt das nicht. Ich erhalte gar keine Daten.

Geht auch gar nicht. Die WHERE-Klausel schaut nach Art=„Ordner“, und eben hatten wir uns darauf geeinigt, daß Art NULL ist, wenn keine Daten vorhanden sind.

Warum die Art=„Ordner“ sein muß, weiß ich nicht - liegt an der Fachlichkeit Deiner Anwendung. Wenn die Einschränkung nötig ist, gehört sie in die Joinbedingung:

ON [HDD].[HDD\_Name]=[Daten].[HDD\_Name]
AND [Daten].[HDD\_Name]="Ordner"

Ansonsten mußt Du die WHERE-Klausel umformulieren:

WHERE [Daten].[HDD\_Name]="Ordner"
 OR [Daten].[HDD\_Name] IS NULL

Ja ich weiß, ich arbeite dran. Doch geht es schneller und ist
es einfacher eine Frage hier zu stellen, als ein ganzes Buch
durchzulesen :wink:

Ja und nein - für ein, zwei Fragen wird das sicher gehen, aber irgendwann merkst Du, daß es unökonomisch ist.

Gruß

Sancho

Mahlzeit!
SELECT [HDD].[HDD_Name], Count([Daten].[Art]) AS Ordner
FROM HDD LEFT JOIN Daten ON [HDD].[HDD_Name]=[Daten].[HDD_Name]
AND Daten.Art=„Ordner“
GROUP BY [HDD].[HDD_Name];

Bei diesem Ausdruck erhalte ich für Daten.Art=„Ordner“ eine Fehlermeldung, „Verknüpfungsausdruck nciht unterstützt.“

Ok, kurze Erklärung meiner Datenbank, weil das obere leider noch immer nicht funktioniert.
Es gibt eine Tabelle Daten:

Titel | HDD\_Name | Größe | Art | Format ...
----- --------
----------------------------------------...

Titel und HDD_Name bilden den zusammengesetzten Primärschlüssel. Titel ist der Name des Ordners, wie er auf der HDD zu finden ist. HDD_Name ist der HDD-Name :wink:. Größe in GB angegebener Speicherplatz der Ordner.
Art kann nur FILM, SERIE oder ORDNER sein. Format kann nur DVD, AVI oder DAT sein.
Auf den HDDs speichere ich also viele schöne Sachen ab, die zwar alle in Ordnern sind, aber für mich in der Datenbank unterschiedlich erfasst werden. Eine DVD in einem Ordner ist von der ART ein FILM und vom FORMAT DVD. Speichere ich aber Daten ab, z.B. Bilder im Ordner Bilder, so ist der Titel „Bilder“, die Art ist ORDNER und das Format ist DAT. Ganz einfach!
Und nun wollte ich mir in einer Zusammenfassung anzeigen lassen, wie viele FILME, SERIEN und ORDNER ich auf den jeweiligen HDDs habe.
Die SQL-Anweisung dazu ist größer als alle anderen und holt ihre Daten aus anderen Abfragen. Jedoch ist das Ergebnis leer, da die Abfrage nach den ORDNERN noch kein Ergebnis bringt.

SELECT [belegt].[HDD], [HDD].[Kapazität], [belegt].[belegt], [frei].[frei], [Titelanzahl].[gesamt] AS Titel\_Anzahl, [DVDanzahl].[DVDs], [AVIanzahl].[AVIs], [Filmanzahl].[Filme], [Serienanzahl].[Serien], [Ordneranzahl].[Ordner]
FROM HDD, belegt, frei, Titelanzahl, DVDanzahl, AVIanzahl, Filmanzahl, Serienanzahl, Ordneranzahl
WHERE ((([HDD].[HDD\_Name])=[belegt].[HDD] And ([HDD].[HDD\_Name])=[frei].[Name] And ([HDD].[HDD\_Name])=[Titelanzahl].[HDD\_Name] And ([HDD].[HDD\_Name])=[DVDanzahl].[HDD\_Name] And ([HDD].[HDD\_Name])=[AVIanzahl].[HDD\_Name] And ([HDD].[HDD\_Name])=[Filmanzahl].[HDD\_Name] And ([HDD].[HDD\_Name])=[Serienanzahl].[HDD\_Name] And ([HDD].[HDD\_Name])=[Ordneranzahl].[HDD\_Name]))
ORDER BY [HDD].[HDD\_Name];

Tja, so siehts aus. Ich weiß nicht ob das gut oder schlecht ist, aber mir reichts für meine Zwecke :smile: Doch für Verbesserungsvorschläge habe ich immer ein offenes Ohr!

MfG
Rogge

zu der ‚kleinen‘ SQL-Anweisung
…damit meine ich die untere :wink:

Die ist großer Mist! Das muss ich wieder mit einem JOIN machen, richtig?! :smile: Sonst wird das nie was.

MfG
Rogge

es geht nicht :frowning:
Guten Morgen!

Access weigert sich eisern, mir diesen JOIN zu erfüllen. Nochmal kurz worum es geht: Ich möchte die Anzahl meiner AVIs auf den HDDs ermitteln. Dabei ist nicht auf jeder HDD eine AVI vorhanden. Die HDDs möchte ich trotzdem in der Liste sehen, und wenn es geht, mit der Zahl „0“ als Ergebnis.
Ein Ausdruck, der mir die Anzahl der AVIs auf den HDDs anzeigt, ist der hier:

SELECT [hdd].[Name], Count(\*) AS Anzahl\_AVIs
FROM hdd,daten 
WHERE [hdd].[name]=[daten].[hddname] AND [daten].[format]="AVI"
GROUP BY [hdd].[Name];

Dabei werden jedoch nicht alle HDDs angezeigt. Ein JOIN der dies erfüllen soll, sieht in etwa so aus:

SELECT [hdd].[Name], Count(\*) AS Anzahl\_AVIs
FROM hdd LEFT JOIN daten ON [hdd].[name]=[daten].[hddname] AND [daten].[format]="AVI"
GROUP BY [hdd].[Name];

Dabei erhalte ich aber eine Fehlermeldung: „Verknüpfungsausdruck nicht unterstützt“. Und das gilt für [daten].[format]=„AVI“, was ich aber zwingend brauche.
Was nun?

MfG
Rogge