November 27, 2020, 06:24:11

Neuigkeiten:

Ist euer Problem gelöst, dann bitte den Knopf "Thema gelöst" drücken!


Berechnungen in Unterabfragen

Begonnen von katana, November 11, 2020, 09:42:06

⏪ vorheriges - nächstes ⏩

katana

Hallo zusammen,

bei folgendem Problem bitte ich um Hilfe, das Thema dürfte wahrscheinlich "verschachtelte Abfragen" sein.

Ich habe eine Tabelle (jaja :-) mit Messdaten und einer eindeutigen, fortlaufenden ID je Datensatz.
Die Tabelle soll aggregiert ausgewertet und dargestellt werden und zwar mit variablen Clustergrößen, z.B. immer 10 Fälle, 50 oder 100.
Das Ergebnis soll eine Tabelle oder Abfrage sein, mit Spalte 1 = "vonID", Spalte 2 = "bisID" und in Spalte 3 - n die Ergebnisse einfacher aggregierter Auswertungen (z.B. Minimum der Variable x im Cluster) oder etwas kompliziertere (Anzahl der Fälle im Cluster, die Bedingung y erfüllen).

Mit reinem VBA-Code, der alles durchnudelt und die Ergebnisse in eine Tabelle schreibt, bekomme ich das hin, es dauert aber eeewig. Mein Gefühl sagt, dass das mit einer (oder mehreren) (Unter-)Abfragen viel schneller geht, aber das übersteigt meine derzeitigen Fähigkeiten. Das kann so nicht bleiben ;-)

Bis jetzt habe ich eine Abfrage, die die Start- und End-ID des jeweiligen Clusters schön darstellt.
Ich scheitere daran, in den Spalten 3 - n Unterabfragen, Ausdrücke oder was auch immer unterzubringen, die sich die Werte aus Spalte 1 (von) und Spalte 2 (bis) holen und damit tun, was sie eben tun sollen, also z.B. "Anzahl der Fälle zwischen [von] und [bis] mit [Variable x] > irgendeinwert".

Kann mir jemand weiterhelfen?

Danke und Grüße
Ferd

ebs17

ZitatKann mir jemand weiterhelfen?
Theoretisch schon, praktisch selbstredend bei dieser Informationslage natürlich nicht.
Mit freundlichem Glück Auf!

Eberhard

katana

Hallo Eberhard,

danke für deine Antwort. Ich dachte schon, ich hätte zu viel geschrieben.
Welche Informationen fehlen denn noch, um helfen zu können.

Grüße
Ferd

MzKlMu

Hallo,
- Tabellenaufbau (genau)
- SQL Text der Abfrage
- Beziehungsbild
Gruß
Klaus

katana

Hallo, sehr gerne.
s. angehängte Demo.db, hoffe, das ist, was ihr braucht.

Die Tabelle tblMessdaten hat real ca. 50.000DS und ca. 50 Variablen für verschiedene Messgrößen.

Die Clustergröße von 10 in der Abfrage qryMessdatenAggregiert ist willkürlich gewählt, damit's zur verringerten Fallzahl in der Tabelle (n=100) passt.

Die Abfrage qryMessdatenAggregiert soll um weitere, berechnete Spalten erweitert werden.
Das Beispiel "qryUnterAbfrage1" enthält eine solche Berechnung. Deren Ergebnis soll in der momentan leeren Dummyspalte der Hauptabfrage stehen.

Am Ende soll die Hauptabfrage ca. 10 solche berechneten Spalten enthalten.


Das alles bildet nur meine Gedanken ab. Ich weiß nicht, ob dieser Weg der effizienteste ist. Vielleicht kann man die Sache ganz anders lösen. Wichtig ist nu, dass das Ergebnis in einem Formular oder Bericht darstellbar ist.

Viele Grüße
Ferd
Sie dürfen in diesem Board keine Dateianhänge sehen.

MzKlMu

Hallo,
Messung1, Messung2 wie viele Messung.. Spalten gibt es denn da ?

Grundsätzlich ist schon mal der Aufbau der Tabelle falsch. Die messwerte gehören in eine Spalte. Zusätzlich ist dann ein Feld von Nöten die die nr der Messung erfasst.
Die Tabelle hätte dann 200 Datensätze, je Messung 100.
Jetzt ist es überhaupt erst möglich Aggregatfunktionen zu nutzen.

Mir ist auch nicht klar, was Du aggregieren willst, die Abfrage qryMessdatenAggregiert aggregiert ja gar nix.
Da wird nur gruppiert.

Die Demo ist eher verwirrend als erhellend, jedenfalls für mich.
Gruß
Klaus

ebs17

So?
SELECT
   G.Von,
   G.Bis,
   COUNT(*) AS AnzahlX
FROM
   (
      SELECT DISTINCT
         ID - 9 AS Von,
         ID AS Bis
      FROM
         tblMessdaten
      WHERE
         ID Mod 10 = 0
   ) AS G,
   (
      SELECT
         *
      FROM
         tblMessdaten
      WHERE
         gueltig = 1
            AND
         messung1 > 10
   ) AS M
WHERE
   M.ID BETWEEN G.Von
      AND
   G.Bis
GROUP BY
   G.Von,
   G.Bis
Mit freundlichem Glück Auf!

Eberhard

katana

Hallo Eberhard,

vielen Dank, das ist die Lösung! Bzw. der erste Teil, jetzt müssen noch mehrere berechnete Felder in die Abfrage integriert werden nach deinem Muster für "AnzahlX".

Ist das grundsätzlich möglich?

Also z.B.
Spalte "AnzahlX" =(gueltig = 1 AND messung1 > 10) -> dein Beispiel
Spalte "AnzahlY" =(gueltig = 1 AND (messung1 > 100 OR messung2 > 10)
Spalte "AnzahlZ" =(gueltig = 0 AND messung1 = messung5)

Wenn ja, dann versuch ich es mal selbst. Bin aber auch für eine Hilfestellung dankbar. Sobald verschachtelt wird in SQL, liest sich das für meine Augen echt schwer, trotz der Aliase....

Danke + viele Grüße
Ferd

ebs17

November 11, 2020, 19:16:07 #8 Letzte Bearbeitung: November 11, 2020, 21:07:44 von ebs17
Zitatmessung5
Echt jetzt? Was ist mit messung127?

Weiteres Nachdenken sollte mit den Hinweisen von Klaus beginnen.

Daneben: Zusätzliche Anforderungen können sehr schnell ganz andere Abfrageformulierungen erfordern. Ein Dranstückeln kann da also problematisch werden, insbesondere wenn man neben dem Funktionieren ein gutes Funktionieren (= Performance) erwartet.

Persönlich würde ich erst einen Überblick über die Gesamtaufgabe bevorzugen, um daraus Strategien und letztendlich Einzelmaßnahmen abzuleiten. Sackgassen sind manchmal erkennbar, bevor man mit dem Kopf an die Wand stößt.
Mit freundlichem Glück Auf!

Eberhard

katana

Hallo Eberhard,

tut mir leid, wollte niemanden verwirren, das mit messung5 war nur ein willkürliches Beispiel.

Die Anforderung, ca. 5 Messgrößen auszuwerten bestand schon am Anfang (also dass die Abfrage aus 2 (von-bis) plus 5 Spalten bestehen wird), ich wollte es nur einfach halten. Tut mir leid, wenn das missverständlich war.

Ich habe die Tabelle in der demo-db nun mit realistischen Feldern ausgestattet, hoffe, damit wird mein Anliegen verständlich. Würde mich freuen, wenn du nochmal helfen könntest.

Frage: Kann ich mit einer verschachtelten Abfrage wie deiner oben (die für einen Messwert toll funktioniert!) auch mehrere derartige Spalten haben (s. Demo)? Wie sähe eine solche Konstruktion aus?

Danke und Grüße
Ferd

Sie dürfen in diesem Board keine Dateianhänge sehen.

MzKlMu

Hallo,
die TAbelle ist falsch aufgebaut. Die messwerte müssen in eine Spalte in einer weiteren Spalte kommt dann ein Kennzeichen für die Art des Messwertes.
Gruß
Klaus

ebs17

ZitatDie messwerte müssen in eine Spalte in einer weiteren Spalte kommt dann ein Kennzeichen für die Art des Messwertes.
Das kommt darauf an, ob das eine richtige Datenbank werden soll mit längerer akkumulierender Datenhaltung, Skalierbarkeit usw., oder ob es "nur" um eine Schnellverwurstung von vorhandenen Daten geht.
Eine durchgehende und nutzbare laufende Nummerierung begegnet mir in praktischen Fällen auch äußerst selten, recht oft müsste man sie erst selber explizit und unmittelbar vor eigentlicher Verwendung erzeugen.
Wie geschrieben: Gesamtüberblick oder Tippeln im Nebel ...

Wenn man mehrere Werte in einem Datensatz verwenden und vergleichen will wie oben angedeutet, müsste man sie auch erst in einen Datensatz bringen, in irgendeiner geeigneten Form.

Mit freundlichem Glück Auf!

Eberhard

ebs17

Etwas anderer Ansatz (Logikauswertung mit Summierung), der sich übersichtlich spaltenweise ausbauen lässt:
SELECT
   G.Von,
   G.Bis,
   SUM(M.MessT) AS M1,
   SUM(M.MessLD) AS M2,
   SUM(M.MessLF) AS M3
FROM
   (
      SELECT DISTINCT
         MessungID - 9 AS Von,
         MessungID AS Bis
      FROM
         tblMessdaten
      WHERE
         MessungID Mod 10 = 0
   ) AS G,
   (
      SELECT
         MessungID,
         Abs(temperatur > 20) AS MessT,
         Abs(luftdruck > 1000) AS MessLD,
         Abs(luftfeuchte = - 9) AS MessLF
      FROM
         tblMessdaten
   ) AS M
WHERE
   M.MessungID BETWEEN G.Von
      AND
   G.Bis
GROUP BY
   G.Von,
   G.Bis
Mit freundlichem Glück Auf!

Eberhard