Ich habe eine Tabelle „HDD“ in der ich die Bezeichnung der HDD und die Kapazität eintrage. In einer weiteren Tabelle „Daten“ trage ich ein, welche Ordner auf einer HDD zu finden sind, und wie groß der jeweilige Ordnerinhalt ist.
Da ich die Kapazität der HDDs und die einzelnen Ordnergrößen habe, muss es doch auch möglich sein, in einem Bericht anzuzeigen, wie viel Platz auf einer HDD noch frei ist, und wie viel Platz bereits belegt. Wie kann ich sowas machen?
Da ich die Kapazität der HDDs und die einzelnen Ordnergrößen
habe, muss es doch auch möglich sein, in einem Bericht
anzuzeigen, wie viel Platz auf einer HDD noch frei ist, und
wie viel Platz bereits belegt. Wie kann ich sowas machen?
Hallo Rogge, ich denke, das müsste auch schon bei einer Abfrage gehen - falls Du die Gesamtkapazität mit in der Tabelle hast. Also bei der Abfrage in ein Feld z. B. eingeben:
frei: Tabelle.[Kapazität]-[belegt]
… ganz sicher bin ich bezüglich der Formulierung aber nicht. Probier’s einfach, vielleicht klappt es ja.
Gruß Verena
So siehts zusammengefasst als kleines Beispiel aus.
Dabei ist [Titel] der Ordnername und [HDD] bekommt die Daten als Auswahl aus der Tabelle „HDD“.
Der belegte Speicherplatz muss also eine Summe der einzelnen Datensätze in „Daten“ sein. Den freien Speicherplatz kann ich mir dann wie du schon geschrieben hast, ganz einfach ausrechnen lassen, Kapazität - belegter Speicherplatz… aber den belegten Speicherplatz brauche ich erstmal
ich hätte da mal zwei Anregungen. Die eine betrifft die Darstellung im Forum, wenn Du Code- oder Datenbeispiele einbringen willst: verwende bitte den PRE-Tag; damit lassen sich wunderbar tabellarische Inhalte darstellen. Für die potentiellen Antworter ist das eine große Vereinfachung.
Die zweite wäre: Du solltest mal SQL und die Grundlagen einer relationalen Datenbank lernen.
Deine Frage betrifft zwei solcher Grundlagenaspekte:
Der Join über zwei Tabellen (um korrespondierende Informationen einer Größe aus zwei Tabellen zuzuordnen)
die Summenbildung einer Gruppe von Datensätzen.
Die Abfrage sieht dann so aus:
SELECT d.HDD, h.[kapazität] - sum(d.[größe]) as [Freier Platz]
FROM hdd as h, daten as d
WHERE d.hdd = h.Name
GROUP BY d.hdd;
Kleine Anmerkung dazu: die Spalte „Name“ Deiner Tabelle HDD ist nicht gut gewählt, weil sie mit internen Attributbezeichnungen kollidiert. Ich würde sie in HDD_Name o.Ä. umbenennen.
Vielen Dank für deine Tipps, ich werde sie mir gerne zu Herzen
nehmen. [Floskel] Man lernt ja nie aus. [/Floskel]
Jou
Dazu muss ich eine neue Abfrage erstellen… und ich wähle mir
dazu die entsprechenden Tabellen aus. Und wo gebe ich dann
diese Zeile ein?
sorry, mein Fehler. Wenn Du in der Entwurfsansicht bist, siehst Du oben links ein paar Knöpfe; einer davon hat die Bezeichnung „SQL“. Drauf geklickt öffnet sich ein Textfenster, da gehört das hin.
SELECT [Daten].[HDD\_Name], [HDD].[Kapazität]-sum([Daten].[Größe]) AS frei
FROM HDD AS h, Daten AS d
WHERE [HDD].[HDD\_Name]=[Daten].[HDD\_Name]
GROUP BY [Daten].[HDD\_Name];
Wenn ich die Abfrage öffne, verlangt er die ganzen Parameter. ([Daten].[HDD_Name] usw.). Ich glaube, da stimmt etwas nicht.
probieren…
Ich habe nun zwei Zeilen ausprobiert. Die hier funktioniert ohne Probleme:
SELECT HDD.HDD\_Name as HDD, HDD.Kapazität as Größe from HDD;
Aber bei der hier erhalte ich eine Fehlermeldung:
SELECT HDD.HDD\_Name as HDD, HDD.Kapazität as Größe, sum(Daten.Größe) as belegt
from HDD, Daten
where HDD.HDD\_Name=Daten.HDD\_Name
group by HDD.HDD\_Name;
MELDUNG:
Sie wollten eine Abfrage ausführen, die den angegebenen Ausdruck ‚Größe‘ nicht als Teil der Aggregatfunktion einschließt.
Tja, ich habe keine Ahnung was mir Access damit sagen will. [google]…[/google] Ich habe herausgefunden, dass sich Aggregatfunktionen nicht mit Attributen mischen lassen.
Demnach sollte das hier funktionieren:
(Ich habe die Angabe über die Kapazität entfernt)
SELECT HDD.HDD\_Name as HDD, sum(Daten.Größe) as belegt
from HDD, Daten
where HDD.HDD\_Name=Daten.HDD\_Name
group by HDD.HDD\_Name;
Stimmt, klappt! Obwohl HDD.HDD_Name doch auch nur ein Attribut ist, genau wie die Angabe über die Kapazität. Das verstehe ich nicht.
Wenn ich die summierte Größe der Daten von der Kapazität abziehen möchte, erhalte ich denselben Fehler wie oben. Das ist doch doof. Warum klappt das denn nicht??
SELECT HDD.HDD\_Name as HDD, HDD.Kapazität-sum(Daten.Größe) as belegt
from HDD, Daten
where HDD.HDD\_Name=Daten.HDD\_Name
group by HDD.HDD\_Name;
SELECT [Daten].[HDD\_Name],
[HDD].[Kapazität]-sum([Daten].[Größe]) AS frei
FROM HDD AS h, Daten AS d
WHERE [HDD].[HDD\_Name]=[Daten].[HDD\_Name]
GROUP BY [Daten].[HDD\_Name];
Wenn ich die Abfrage öffne, verlangt er die ganzen Parameter.
([Daten].[HDD_Name] usw.). Ich glaube, da stimmt etwas nicht.
Logisch. Um die Abfrag übersichtlich zu gestalten, habe ich Aliasse für die Tabellen vergeben:
FROM HDD AS h, Daten AS d
Du sprichst die Tabellen nicht über die Aliasse an, sondern über deren ursprünglichen Namen:
WHERE [HDD].[HDD\_Name]=[Daten].[HDD\_Name]
Das kann nicht funktionieren.
Entweder Du verzichtest auf die Aliasse, oder Du benutzt sie konsequent
MELDUNG:
Sie wollten eine Abfrage ausführen, die den angegebenen
Ausdruck ‚Größe‘ nicht als Teil der Aggregatfunktion
einschließt.
Tja, ich habe keine Ahnung was mir Access damit sagen will.
[google]…[/google] Ich habe herausgefunden, dass sich
Aggregatfunktionen nicht mit Attributen mischen lassen.
stimmt, sorry.
Demnach sollte das hier funktionieren:
SELECT HDD.HDD\_Name as HDD, sum(Daten.Größe) as belegt
from HDD, Daten
where HDD.HDD\_Name=Daten.HDD\_Name
group by HDD.HDD\_Name;
Stimmt, klappt! Obwohl HDD.HDD_Name doch auch nur ein Attribut
ist, genau wie die Angabe über die Kapazität. Das verstehe ich
nicht.
Das ist so: die Group By-Klausel erstellt sozusagen immer Pärchen: einmal das Merkmal, über das gruppiert wird (hdd.name in dem Beispiel), und einmal das Ergebnis der Gruppenfunktion für diese Gruppe.
Wenn ich die summierte Größe der Daten von der Kapazität
abziehen möchte, erhalte ich denselben Fehler wie oben. Das
ist doch doof. Warum klappt das denn nicht??
Weil beides mischen nicht erlaubt ist.
Aber Du kannst Dir mit einem Trick aushelfen: nutze eine Aggregatfunktion, die den gleichen Wert wie die nicht-aggregierte Größe liefert. Für die Kapazitätsangabe könntest Du MIN(), MAX() oder auch AVG nehmen - es ist egal, denn die minimale Größe einer einzigen Angabe ist genau diese Angabe.
SELECT HDD.HDD\_Name AS HDD,
MIN(HDD.Kapazität)-SUM(Daten.Größe) AS belegt
FROM HDD, Daten
WHERE HDD.HDD\_Name=Daten.HDD\_Name
GROUP BY HDD.HDD\_Name;
SELECT HDD.HDD_Name AS HDD,
MIN(HDD.Kapazität)-SUM(Daten.Größe) AS belegt
FROM HDD, Daten
WHERE HDD.HDD_Name=Daten.HDD_Name
GROUP BY HDD.HDD_Name;
Vielen Dank, das klappt super
Nebenbei bemerkt: müßte es nicht
heißen:
MIN(HDD.Kapazität)-SUM(Daten.Größe) AS frei?
Gruß
Ja, mit den Namen ist das soeine Sache. Das kam gestern beim ganzen Ausprobieren bei rum. Da war dann auf einmal alles durcheinander sodass ein Zirkelbezug entstand und Access sauber abgeschmiert ist
Das habe ich aber wieder unter Kontrolle, weil mir das wie gesagt schon gestern „aufgefallen“ war