verwendetes Datenbanksystem: MSS SQL 2008
Hallo,
Ich habe mir eine Abfrage gebastelt, welche mir Messdaten so auffbereitet, dass sie in einer Form zurückkommen die als Histogramm auswertbar sind.
Beispielabfrage:
SELECT
((Sin/5)*5) AS untereGrenze,
((Sin/5+1)*5) AS obereGrenze,
Count(Sin) AS Daten
FROM PE
GROUP BY (( Sin/5)*5) , ((Sin/5+1)*5)
HAVING ((Sin/5)*5)>0 AND ((Sin/5+1)*5)<5000
Ergebniss bei ganzzahligen Werten sind als Bild angehängt.
Das eigentliche Problem tritt nun bei Fließkommazahlen auf. Wird im nächsten Post genauer erläutert, da nur 1 Bild pro Post gestatttet ist.
Beispielabfrage über eine Tabelle mit Fließkommawerten:
SELECT
((IOut/0.2)*0.2) AS untereGrenze,
((IOut/0.2+1)*0.2) AS obereGrenze,
Count(IOut) AS Daten
FROM PE
GROUP BY (( IOut/0.2)*0.2) , ((IOut/0.2+1)*0.2)
HAVING ((IOut/0.2)*0.2)>20 AND ((IOut/0.2+1)*0.2)<80
hier wird zwar in 0,2 Abständen Gruppiert doch die Schrittweite ist sehr variabel.
Als Anhang ein Ausschnitt des Ergebnisses
Hat evtl. jemand eine Idee wo der Fehler liegen könnte? Ich drehe mich nur im Kreis und bräuchte ein paar Anregungen wo dei Fehlerquelle liegen könnte.
Danke und Gruß
David
Hi Toxo,
Das eigentliche Problem tritt nun bei Fließkommazahlen auf. Wird im nächsten Post genauer erläutert, da nur 1 Bild pro Post gestatttet ist.
Hat evtl. jemand eine Idee wo der Fehler liegen könnte?
Wenn du jetzt auch noch dein Problem erklären würdest, könnte dir evtl. jemand weiterhelfen...
Christian
Weeks of programming can save you hours of planning
Ich versteh noch nicht ganz das Problem. Meinst du die Sprünge in der ersten Spalte also z.B. 40.0, 40.1, 40.7? Diese Sprünge hast du in der anderen Tabelle auch, das liegt aber wohl einfach daran, dass du im Bereich 40.2 bis 40.6 keine Daten hast.
Schon mal überprüft?
Edit: ich bin mir auch nicht ganz sicher, ob dein Statement überhaupt einen Sinn hat. Im Endeffekt lieferst du nur die Anzahl jeder Ausprägung von IOut, wobei die Ausprägung die erste Spalte darstellt und die 2. spalte nur die erste spalte + 0.2 ist. Im Grunde kannst du eigentlich auch die ganze Rumrechnerei weglassen, weil du ja sowieso nur IOut und IOut + 0.2, und die dazugehörige Anzahl lieferst.
Hi Toxo,
Das eigentliche Problem tritt nun bei Fließkommazahlen auf. Wird im nächsten Post genauer erläutert, da nur 1 Bild pro Post gestatttet ist.
Hat evtl. jemand eine Idee wo der Fehler liegen könnte?
Wenn du jetzt auch noch dein Problem erklären würdest, könnte dir evtl. jemand weiterhelfen...
Christian
ja irgendwie hab ich das vergessen. Verzeihung.
im 2. Post ist eine Schrittweite für das Histogramm von 0,2 angegeben.
Ich erwarte also nur alle Vielfache von 0,2 einen Wert. In der Datatable tauchen aber Werte 36,5, 36,6, 36,7, 36,8......
erwarten tue ich aber 36,4, 36,6, 36,8, 37....
Die Abstände zwischen obergrenze und untergrenze sind Korrekt mit 0,2 nur die Schrittweite ist eifnach nicht Korrekt.
wenn ich nun eine Schrittweite von 1 angebe sieht es zum Beispiel so aus
untereGrenze | obereGrenze| Anzahl gefundener Datensätze
34,8 | 35,8 | 38
35,4 | 36,4 | 18
35,7 | 36,7 | 3
36 | 37 | 12
usw...
erwünschte ausgabe wär:
34| 35 | 20
35 | 36 | 24
36 | 37 | 18
usw.
Ich hoffe es ist nun etwas klarer wo das Problem liegt.
Ich versteh noch nicht ganz das Problem. Meinst du die Sprünge in der ersten Spalte also z.B. 40.0, 40.1, 40.7? Diese Sprünge hast du in der anderen Tabelle auch, das liegt aber wohl einfach daran, dass du im Bereich 40.2 bis 40.6 keine Daten hast.
Schon mal überprüft?
Edit: ich bin mir auch nicht ganz sicher, ob dein Statement überhaupt einen Sinn hat. Im Endeffekt lieferst du nur die Anzahl jeder Ausprägung von IOut, wobei die Ausprägung die erste Spalte darstellt und die 2. spalte nur die erste spalte + 0.2 ist. Im Grunde kannst du eigentlich auch die ganze Rumrechnerei weglassen, weil du ja sowieso nur IOut und IOut + 0.2, und die dazugehörige Anzahl lieferst.
Die Sprünge machen kein Problem da die Datatable so wie sie ist an ein Diagramm übergeben wird und es nur um das finden de Gausskurve geht.
die unregelmäßge Schrittweite bei double Werten zerstückelt mir aber meine Gausskurve und ist so nicht zur Auswertung geeignet.
Die Rechnerei ist notwendig damit ich Werte in Bereiche gruppieren kann die eben durch meine Schrittweite angegeben wird. Diese ist im 1. Fall 5 und im 2. fall 0,2
Ich sag mal da musst du etwas mehr investieren. du kannst aus den Daten 1,3,3,3,5,5 nicht die Zeilen 1,2,3,4,5 erzeugen. Dazu müsstest du dir erst eine (temporäre?) Tabelle mit der richtigen Schrittweite erzeugen und dann deine Daten per LEFT JOIN anhängen.
SELECT
((IOut/0.2)*0.2) AS untereGrenze,
((IOut/0.2+1)*0.2) AS obereGrenze
FROM PE
Diese Berechnung ergibt doch nichts anderes aus als dieser gekürzte Code:
SELECT
IOut AS untereGrenze,
IOut+0.2 AS obereGrenze
FROM PE
Wahrscheinlich hast du vergessen zu runden, bzw. die Nachkommastellen abzuschneiden.
Christian
Weeks of programming can save you hours of planning
Ich sag mal da musst du etwas mehr investieren. du kannst aus den Daten 1,3,3,3,5,5 nicht die Zeilen 1,2,3,4,5 erzeugen. Dazu müsstest du dir erst eine (temporäre?) Tabelle mit der richtigen Schrittweite erzeugen und dann deine Daten per LEFT JOIN anhängen.
folgende Daten 1,3,5,7
(1/5)*5 = 0
(1/5+1)*5 = 5
+1 in Datenatz zwischen 0-5
(3/5)*5 = 0
(3/5+1)*5 = 5
+1 in Datensatz zwischen 0-5
(5/5)*5 = 5
(5/5+1)*5 = 10
+1 in Datensatz zwischen 5-10
(7/5)*5 = 5
(7/5+1)*5 = 10
+1 in Datensatz zwischen 5-10
resultat
untereGrenze|obereGrenze| Daten
0| 5|2
5|10|2
Was ist an dieser Überlegung falsch?
SELECT ((IOut/0.2)*0.2) AS untereGrenze, ((IOut/0.2+1)*0.2) AS obereGrenze FROM PE
Diese Berechnung ergibt doch nichts anderes aus als dieser gekürzte Code:
SELECT IOut AS untereGrenze, IOut+0.2 AS obereGrenze FROM PE
Wahrscheinlich hast du vergessen zu runden, bzw. die Nachkommastellen abzuschneiden.
Christian
Stimmt du hast recht. Mein Problem ist das ich eine Abfrage wollte die Funktioniert ohne das ich die Tabelle kenne oder weiß auf welchen Datentyp ich überhaupt zugreife. Das ist dann wohl doch noch nicht der richtige Weg.
Daß es mit ganzzahligen Werten funktioniert, hast du doch bereits mehrfach angesprochen. Aber hast du diese Proberechnung auch mal mit unrunden Werten durchgeführt?
Bitte beachte [Hinweis] Wie poste ich richtig?
Christian
// Edit:
(7/5)*5 != 5
// Edit 2:
Ich glaub deine gesamte Rechnung ist falsch, wieso ist 1 / 5 * 5 und 3 / 5 * 5 gleich 0? Da stimmt doch irgendetwas hinten und vorne nicht.
Weeks of programming can save you hours of planning
// Edit 2:
Ich glaub deine gesamte Rechnung ist falsch, wieso ist 1 / 5 * 5 und 3 / 5 * 5 gleich 0? Da stimmt doch irgendetwas hinten und vorne nicht.
1/5 laut eigentlich 0,2 da die Werte aus einer Tabellenspalte kommt mit Datentyp smallInt ist 1/5 =0 und 0*5 =0
daher (1/5)*5 =0
Ich glaube, wir drehen uns da im Kreis. Wenn du nicht weißt (oder nachschauen willst), daß sich Integer-Datentypen anders verhalten als Fließkommazahlen, dann fällt das eindeutig unter [Hinweis] Wie poste ich richtig?, Punkt 1.1.1
Christian
Weeks of programming can save you hours of planning
Ja aber genau das war doch meine Frage 🙁
Ob es möglich ist diese Art der Abfrage einfach anzupassen ohne das ich die Datenmenge "von Hand" durchfiltern muss.
Ja ich kenne die Unterschiede zwischen den Datentypen und im Prinzip wollte ich nur wissen ob die Art der Abfrage so Anwendbar ist oder ob man es Grundlegend ändern muss.
Ich strapaziere ein wenig unabsichtlich deine Geduld. Entschuldigung dafür.
im Prinzip wollte ich nur wissen ob die Art der Abfrage so Anwendbar ist
Offenbar nicht.
oder ob man es Grundlegend ändern muss.
Ja, siehe meine und tkrasingers Antworten von oben.
Christian
Weeks of programming can save you hours of planning
Ja aber genau das war doch meine Frage
Du meinst also, wie du quasi einen Cast in SQL durchführen kannst, sodass du mit Gleitkommazahlen rechnen kannst, obwohl deine Spalten vom Typ int sind?
Probiere es mal mit CAST und CONVERT (Transact-SQL)
Generell muss ich aber MrSparkle zustimmen, daher ==> geschlossen.