SQL Berechnung

Antwort erstellen


BBCode ist eingeschaltet
[img] ist ausgeschaltet
[url] ist eingeschaltet
Smileys sind ausgeschaltet

Die letzten Beiträge des Themas
   

Ansicht erweitern Die letzten Beiträge des Themas: SQL Berechnung

Re: SQL Berechnung

von hawe » So, 05.10.2008 20:11

Vielen Dank für das umfangreiche Beispiel.
Das muss ich mir mal auf der Zunge zergehen lassen.
Dass die Anzahl der Summanden hart codiert werden muss ist evtl. ein Killerkriterium. Wir fangen gerade erst an diese Daten auszuwerten und ich hab noch keinen PLan, was in der Praxis für einen Batch an Daten anfällt. Es könnten allerdings sehr unterschiedliche Zusammenstellungen möglich sein. Ich hätte mir gerne erspart die Daten immer erst nach Calc zu holen und dort die Auswertung zu machen. Naja, schau'n mer mal wie geht.
Danke für das Beispiel werde es mal versuchen umzusetzen...

Re: SQL Berechnung

von Barlee » So, 05.10.2008 19:51

Hallo hawe,

ich orientiere mich einmal an Deinem Ausgangsbeitrag mit folgender Tabelle Tab_Summe
Tab_Summe.png
Tab_Summe.png (13.26 KiB) 1872 mal betrachtet
Diese Tabelle wird mit einer laufenden Nummer versehen.

Code: Alles auswählen

SELECT "Tab_Summe".*, ( SELECT COUNT( * ) FROM "Tab_Summe" AS "Tab_Sub" WHERE "Tab_Summe"."ID" >= "Tab_Sub"."ID" ) AS "lfd" FROM "Tab_Summe"
Das Ergebnis ist folgendes:
Tab_Summe_V.png
Tab_Summe_V.png (11.39 KiB) 1874 mal betrachtet
Obige Abfrage wird als View Tab_Summe_V gespeichert (rechte Maustaste auf Abfrage >> als Ansicht speichern), um im nächsten Schritt darauf zuzugreifen.
Jetzt wird der View abgefragt und anhand der laufenden Nummer ausgewertet: ("SQL Kommando direkt ausführen" muss aktiviert sein)

Code: Alles auswählen

SELECT
"Sw",
"Sb",
"Zeit" 

FROM 
(
SELECT 
"Gruppe",
"Sw",
"Sb",
sum("t") AS "Zeit"  

FROM
(
SELECT
* 
,CASE
WHEN "lfd" = (SELECT min("lfd") FROM "Tab_Summe_V") THEN "lfd"
WHEN (CONCAT("Sw","Sb") <> (SELECT CONCAT("Sw","Sb") FROM "Tab_Summe_V" "B1" WHERE "Tab_Summe_V"."lfd"-1 = "B1"."lfd")) THEN "lfd"
WHEN (CONCAT("Sw","Sb") <> (SELECT CONCAT("Sw","Sb") FROM "Tab_Summe_V" "B1" WHERE "Tab_Summe_V"."lfd"-2 = "B1"."lfd")) THEN "lfd"-1
WHEN (CONCAT("Sw","Sb") <> (SELECT CONCAT("Sw","Sb") FROM "Tab_Summe_V" "B1" WHERE "Tab_Summe_V"."lfd"-3 = "B1"."lfd")) THEN "lfd"-2
WHEN (CONCAT("Sw","Sb") <> (SELECT CONCAT("Sw","Sb") FROM "Tab_Summe_V" "B1" WHERE "Tab_Summe_V"."lfd"-4 = "B1"."lfd")) THEN "lfd"-3
WHEN (CONCAT("Sw","Sb") <> (SELECT CONCAT("Sw","Sb") FROM "Tab_Summe_V" "B1" WHERE "Tab_Summe_V"."lfd"-5 = "B1"."lfd")) THEN "lfd"-4
WHEN (CONCAT("Sw","Sb") <> (SELECT CONCAT("Sw","Sb") FROM "Tab_Summe_V" "B1" WHERE "Tab_Summe_V"."lfd"-6 = "B1"."lfd")) THEN "lfd"-5
WHEN (CONCAT("Sw","Sb") <> (SELECT CONCAT("Sw","Sb") FROM "Tab_Summe_V" "B1" WHERE "Tab_Summe_V"."lfd"-7 = "B1"."lfd")) THEN "lfd"-6
WHEN (CONCAT("Sw","Sb") <> (SELECT CONCAT("Sw","Sb") FROM "Tab_Summe_V" "B1" WHERE "Tab_Summe_V"."lfd"-8 = "B1"."lfd")) THEN "lfd"-7
WHEN (CONCAT("Sw","Sb") <> (SELECT CONCAT("Sw","Sb") FROM "Tab_Summe_V" "B1" WHERE "Tab_Summe_V"."lfd"-9 = "B1"."lfd")) THEN "lfd"-8
WHEN (CONCAT("Sw","Sb") <> (SELECT CONCAT("Sw","Sb") FROM "Tab_Summe_V" "B1" WHERE "Tab_Summe_V"."lfd"-10 = "B1"."lfd")) THEN "lfd"-9
else (SELECT min("lfd") FROM "Tab_Summe_V")
End  "Gruppe"

FROM
"Tab_Summe_V" 
)
GROUP BY  "Gruppe","Sw","Sb"
) 

Ergebnis:
Ergebnis.png
Ergebnis.png (5.77 KiB) 1874 mal betrachtet
Die Abfrage berücksichtigt in dieser Form max. 10 aufeinanderfolgende gleiche Kombinationen von Sw und Sb, könnte aber durch entsprechende Einträge unter CASE ... WHEN erweitert werden. Ich bin mir nicht sicher, ob eine dynamische Umsetzung unter HSQLDB möglich ist. Ich vermute nein.
Vielleicht findest Du in diesem Beispiel einige Anregungen, Deine eigene Lösung zu finden.

Gruß Barlee

Re: SQL Berechnung

von hawe » So, 05.10.2008 17:05

Nun, die Tabellen liegen in einer Access-Datenbank vor.
Ich kann sie zumindest ausbauen und ein ID-Feld ergänzen. GGf kann ich den Hersteller auch davon überzeugen eine ID einzubauen. Hättest Du ein Beispiel zu dem von Dir geschilderten Verfahren?
Falls Du mal einen Blick auf meine Daten werfen willst, hab ich auf
http://www.lemitec.de/archiv/SwopperBatch.odb
eine Kopie hinterlegt - BatchID 18 und 16 enthalten relevante Aufzeichnungen.

Re: SQL Berechnung

von Barlee » So, 05.10.2008 16:11

Hallo hawe,

das könnte man, indem man der Ausgangstabelle eine laufende Nummer (lfd) zuweist und dann mittels SELF JOIN den Vorgängerdatensatz durch lfd-1 lokalisiert und auswertet.

Hast Du die Möglichkeit, Deiner Tabelle eine Spalte ID (die Du auch als Primärschlüssel nutzen könntest) hinzuzufügen? Am besten Auto-Increment, so dass beim Erstellen neuer Datensätze automatisch hochgezählt wird?
Das wäre Voraussetzung, um eine laufende Nummer zu erzeugen und den geschilderten Ansatz zu verfolgen.

Gruß Barlee

Re: SQL Berechnung

von hawe » So, 05.10.2008 15:45

Hm, ich hab nur t, das ist die Zeit mit einem Takt von 2 Sekunden 0,2,4,6,8,...
Wie könnte man es denn anstellen die Schaltstelle zu ermitteln, also den Zustand eines Datensatzes (also die Messwerte Sw und SB) mit seinem Vorgänger zu vergleichen?

Re: SQL Berechnung

von Barlee » Sa, 04.10.2008 18:01

Hallo hawe,

sicherlich lösbar, allerdings sehr aufwendig. Problematisch ist die Abgrenzung der jeweiligen Summierung und die Tatsache, dass die gleiche Kombination von "Sw" und "Sb" zu einem späteren Zeitpunkt erneut auftreten kann.
Hast Du noch weitere Spalten in Deiner Tabelle, die man zur Differenzierung der Messungen benutzen kann (Datum, Uhrzeit der Messung, Datensatz ID o.ä)?

Gruß Barlee

Re: SQL Berechnung

von hawe » Sa, 04.10.2008 13:46

Ein einfaches Group By taugt nicht.
Es gibt wechselnde Abschnitte und ich muss ein Ergebnis nach JEDER Änderung von Sw und SB haben und das auch in der zeitlichen Abfolge des Auftretens.
in BASIC:
Ich summiere t in einer Schleife solange bis eine Änderung in Sw oder SB auftritt und schreibe das Zwischenergebnis weg. Setze t = 0 und weiter gehts. Das Endziel ist eine Arbeitsanweisung wie lange jeweils mit den Einstellgen Sw bzw. SB gearbeitet wurde wobei auch die zeitliche Abfolge von INteresse ist:
1. Beginne mit Sw=8 SB=1 für 30 Sekunden
2. Sw=8, SB=2 für 20 Sekunden
3. usw.

Re: SQL Berechnung

von Barlee » Sa, 04.10.2008 13:02

Hallo hawe,

kommst Du mit folgender Abfrage zu gewünschtem Ziel?

Code: Alles auswählen

SELECT
ID,
sum(t),
Sw,
SB
from [Deine_Tabelle]
group by 
ID,
Sw,
SB
Wie verfährst Du mit den Werten der Spalten Tp und Sp?

Gruß Barlee

Re: SQL Berechnung

von hawe » Sa, 04.10.2008 12:50

Nein, das hab ich wohl nicht richtig erklärt:

Sw nimmt im Verlauf der Messwerterfassung Werte zwischen 0 und 8 an.
SB nimmt im Verlauf der Messwerterfassung Werte zwischen 0 und 4 an.
Und ich brauche jeweils die Summe eines Abschnittes der Messreihe wo sich Sw und SB nicht ändern.
Immer wenn sich Sw oder SB ändert brauche ich die Summe t mit den Steuerungswerten, die für diesen Abschnitt gemessen wurden. t ist ein Zeitwert (Sekunden) und als Ergebnis hab ich dann sowas

Code: Alles auswählen

Sw 8    40 Sekunden  bei Messerdrehzahl 150 und SB 1   T:6,9°C
Sw 8    40 Sekunden  bei Messerdrehzahl 150 und SB 2    T: 3,2°C
Sw 2      8 Sekunden  bei Messerdrehzahl 1360 und SB 2  T: 1,5°C

Re: SQL Berechnung

von sven1810 » Sa, 04.10.2008 12:29

Hi, wenn ich das richtig verstanden habe wäre das etwas für einen Bericht oder als einfachen Darstellung als Tabelle.
select spalte1 , spalte2, .... spalte 3 + spalte 4 as summe-sp3-sp4 from tabelle

so z.b.

Gruß

Sven

SQL Berechnung

von hawe » Sa, 04.10.2008 11:59

Hallo zusammen,

ich habe ein paar hundert Messwerte

Code: Alles auswählen

Id	t	Tp	 Sp	 Sw	 SB    
18	00	20,2	1,5	8	1
18	02	20,2	1,5	8	1
18	04	20,4	1,5	8	1
18	06	20,2	1,5	8	1
18	08	20,2	1,5	8	1
18	10	20,2	1,5	8	1
18	12	20,1	1,5	8	1
18	14	19,1	1,5	8	1
Sw = 0,1, ...8 und SB=0,1,...4

Ich muss nun die Werte zusammenfassen anhand der Führungswerte Sw und SB. d.h. ich summiere jeweils t auf bis sich Sw oder SB ändert und schreibe dann die Daten incl. SUmme in eine neue Tabelle. Bis lang arbeite ich in Calk und habe dafür einen Makro geschrieben.
Kann man diese Aufgabe auch in SQL-Abfrage lösen oder müsste ich auch unter Base einen Makro dafür anstellen?

Nach oben