Summe mehrerer Datensätze

Hallo!

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?

MfG,
Rogge

Eventuell so …

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

Hallo Verena,

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 so einfach wird es sicher nicht. Die Kapazitäten der einzelnen HDDs sind wie gesagt in einer einfachen Tabelle „HDD“:

[Name] | [Kapazität]

HDD1 | 300GB
HDD2 | 250GB

Und der Inhalt der HDDs ist in einer weiteren Tabelle „Daten“:

[Titel] | [HDD] | [Größe]
Film1 | HDD1 | 4,35
Film2 | HDD1 | 5,75
Film3 | HDD1 | 3,82
Musik | HDD2 | 22,8
Fun | HDD2 | 3,7
Opern | HDD2 | 45,2

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 :smile:

MfG
Rogge

Mahlzeit,

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.

Gruß

Sancho

Hallo Sancho!

Vielen Dank für deine Tipps, ich werde sie mir gerne zu Herzen nehmen. [Floskel] Man lernt ja nie aus. [/Floskel] :smiley:

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;

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?

MfG
Rogge

Hi!

Vielen Dank für deine Tipps, ich werde sie mir gerne zu Herzen
nehmen. [Floskel] Man lernt ja nie aus. [/Floskel] :smiley:

Jou :smile:

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.

Gruß

Sancho

Es sieht jetzt so aus:

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. :frowning:

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;

klappt über einen umweg…
… mit einer weiteren abfrage, die sich auf die erste abfrage bezieht:

SELECT HDD.HDD\_Name, HDD.Kapazität-Frei.belegt as frei from HDD,frei ;

etwas umständlich weil ich zwei abfragen bauen muss um mein ziel zu erreichen, aber wenn’s hilft :smile:

MfG
Rogge

Mahlzeit,

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.
:frowning:

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 :smile:

Gruß

Sancho

Mahlzeit,

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;

Nebenbei bemerkt: müßte es nicht heißen:

MIN(HDD.Kapazität)-SUM(Daten.Größe) AS **frei**?

Gruß

Sancho

Nabend!

Aber Du kannst Dir mit einem Trick aushelfen: …

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 :smiley:

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 :smiley:
Das habe ich aber wieder unter Kontrolle, weil mir das wie gesagt schon gestern „aufgefallen“ war :wink:

MfG
Rogge