Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi Berechnungsfehler ? (https://www.delphipraxis.net/174884-berechnungsfehler.html)

haentschman 16. Mai 2013 10:35

Datenbank: ElevateDB • Version: ? • Zugriff über: ?

Berechnungsfehler ?
 
Guten Morgen...

Bitte sagt mir wer doof ist. Ich oder die DB... :roll:

select * from A -> 2824 Datensätze
select distinct * from A -> 2756 Datensätze
select * from A group by X having Count(*) = 1 -> 2694 Datensätze
select * from A group by X having Count(*) > 1 -> 62 Datensätze -> 2694 + 62 = 2756...korrekt

aaaber...
2824 - 2756 = 68 ! Wo sind meine 6 Datensätze?

...ich mache mir erst mal nen Kaffee. Vieleicht hilfts. 8-)

baumina 16. Mai 2013 10:49

AW: Berechnungsfehler ?
 
statt
Code:
select distinct * from A
evtl.

Code:
select distinct X from A
?

haentschman 16. Mai 2013 10:50

AW: Berechnungsfehler ?
 
Danke für deine Antwort. 8-)

Das *, damit alle Felder einbezogen werden und damit der gesamte Datensatz eindeutig ist.

baumina 16. Mai 2013 10:51

AW: Berechnungsfehler ?
 
Aber du machst doch auch einen Group by X, demnach sollte evtl auch das distinct wissen was zu gruppieren ist?

jobo 16. Mai 2013 10:53

AW: Berechnungsfehler ?
 
mal abgesehen von der ungewöhnlichen groub by Anweisung- nie von der DB gehört:
Wenn Du die mehrfachen Datensätze zählst, zählst Du mit dieser Anweisung nicht die tatsächliche Zahl, sondern die Zahl der eindeutigen, aber mehrfach vorhandenen Datensätze.
Richtig wäre wohl, ein "select * from .. not in [eindeutig]" oder "[alles] minus [eindeutig]".

haentschman 16. Mai 2013 10:55

AW: Berechnungsfehler ?
 
having verlangt immer eine Gruppierung nach einem Feld. Es ist aber egal ob ich in die Gruppierung ein Feld oder alle aufnehme... es bleiben 62 Datensätze. :(

Zitat:

mal abgesehen von der ungewöhnlichen groub by Anweisung- nie von der DB gehört:
Du hast noch nie von group by gehört ?

Bummi 16. Mai 2013 10:59

AW: Berechnungsfehler ?
 
Ich kenne ElevateDB nicht, werden NULL's mit gruppiert?

haentschman 16. Mai 2013 11:04

AW: Berechnungsfehler ?
 
Da muß ich dich leider enttäuschen. In der Tabelle gibt es nicht einen NULL Wert. Alle Felder sind ausgefüllt.

Danke trotzdem... :wink:

jobo 16. Mai 2013 11:10

AW: Berechnungsfehler ?
 
Zitat:

Du hast noch nie von group by gehört ?
Natürlich, es ging um "Select * " versus "Group by x"
Macht m.E. keinen Sinn bzw erinnert mich an mySQL mit "automatischer/intelligenter" Gruppierung, das ist Schrott.

Unabhängig davon scheint mir das Verfahren wegen der Gruppierung von Mehrfachdatensätzen falsch.

baumina 16. Mai 2013 11:12

AW: Berechnungsfehler ?
 
Warum ein select distinct * überhaupt weniger Datensätze als ein select * liefert, ist mir ein Rätsel, ausser diese mir auch unbekannte Datenbank, hat in ihren Tabellen keine eindeutigen IDs.

Lemmy 16. Mai 2013 11:16

AW: Berechnungsfehler ?
 
Zitat:

Zitat von haentschman (Beitrag 1215488)
Guten Morgen...

Bitte sagt mir wer doof ist. Ich oder die DB... :roll:

select * from A -> 2824 Datensätze
select * from A group by X having Count(*) > 1 -> 62 Datensätze -> 2694 + 62 = 2756...korrekt

Du hast 62 Datensätze die mehr als einmal da sind, d.h. da wird es wohl auch ein paar geben, die mehr als 2x da sind.. daher dann der Unterschied

du lässt dir in der unteren Abfrage ja nur die DS ausgeben, die mehr als einmal da sind. Mach mal ein
Code:
select * from A group by X having Count(*) > 2

p80286 16. Mai 2013 11:18

AW: Berechnungsfehler ?
 
Abgesehen von der nicht eindeutigen ID, könnte deine Tabelle ein View ohne ID sein?

Gruß
K-H

Uwe Raabe 16. Mai 2013 11:19

AW: Berechnungsfehler ?
 
Zitat:

Zitat von baumina (Beitrag 1215504)
Warum ein select distinct * überhaupt weniger Datensätze als ein select * liefert, ist mir ein Rätsel, ausser diese mir auch unbekannte Datenbank, hat in ihren Tabellen keine eindeutigen IDs.

Das ist genau der Punkt - in der Tabelle kommen identische Datensätze mehrfach vor. Das ist aber erstmal nicht verboten.

Jumpy 16. Mai 2013 11:19

AW: Berechnungsfehler ?
 
Du hast da einen Denkfehler.

Du hast
2694 eindeutige Datensätze und
62 Datensätze die es mehrfach gibt
insgesamt hast du also 2756 verschiedene Datensätze
(und zur wiederholung, von diesen 2756 verschiedenen gibt es 62 die jeweils mehrfach vorkommen).

Mit 2824 - 2756 = 68 weißt du nun, das in diesen 68 die 62 drin stecken, d.h. doppelt vorkommen. Dann bleiben noch 6 übrig, z.B. daher das einige der Datensätze, z.B. 6 3fach vorkommen, oder 3 die 4fach vorkommen, oder...

Uwe Raabe 16. Mai 2013 11:23

AW: Berechnungsfehler ?
 
Zitat:

Zitat von Lemmy (Beitrag 1215505)
Du hast 62 Datensätze die mehr als einmal da sind, d.h. da wird es wohl auch ein paar geben, die mehr als 2x da sind.. daher dann der Unterschied

du lässt dir in der unteren Abfrage ja nur die DS ausgeben, die mehr als einmal da sind.

Richtig! Und die werden bei der Gruppierung eben zu einem Datensatz zusammengefasst.

haentschman 16. Mai 2013 11:23

AW: Berechnungsfehler ?
 
Zitat:

Warum ein select distinct * überhaupt weniger Datensätze als ein select * liefert, ist mir ein Rätsel, ausser diese mir auch unbekannte Datenbank, hat in ihren Tabellen keine eindeutigen IDs.
Zu meiner Verteidigung: Ist nicht meine DB.
Diese Tabelle, bzw. ihr Inhalt, ist nicht korrekt. Ich mache eine Analyse. Die Tabelle enthällt doppelte bzw. mehrfache identische Datensätze. Jeder Datensatz hat keine eindeutige ID. Ursprünglich sollte er in sich eindeutig sein.
Wie gesagt es geht nicht um das warum und wieso mit der Tabelle. 8-)
Ich kann mir nur die unterschiedlichen Werte nicht erklären (SQL).

DANKE ...
Zitat:

Mit 2824 - 2756 = 68 weißt du nun, das in diesen 68 die 62 drin stecken, d.h. doppelt vorkommen. Dann bleiben noch 6 übrig, z.B. daher das einige der Datensätze, z.B. 6 3fach vorkommen, oder 3 die 4fach vorkommen, oder...
...eben habe ich es noch selbst gesagt, das einige noch mehrfach vorkommen. :wall: Manchmal sieht man den Wald vor Bäumen nicht.

Tschuldigung für die Belästigung... :lol:

p80286 16. Mai 2013 11:35

AW: Berechnungsfehler ?
 
Zitat:

Zitat von haentschman (Beitrag 1215510)
Zitat:

Mit 2824 - 2756 = 68 weißt du nun, das in diesen 68 die 62 drin stecken, d.h. doppelt vorkommen. Dann bleiben noch 6 übrig, z.B. daher das einige der Datensätze, z.B. 6 3fach vorkommen, oder 3 die 4fach vorkommen, oder...
...eben habe ich es noch selbst gesagt, das einige noch mehrfach vorkommen. :wall: Manchmal sieht man den Wald vor Bäumen nicht.

Tschuldigung für die Belästigung... :lol:

Dafür hast Du ja uns
Gruß
K-H

sx2008 16. Mai 2013 11:42

AW: Berechnungsfehler ?
 
SQL-Code:
select X, COUNT(*) AS Anzahl from A
group by X
Summiert man die Werte im Feld "Anzahl" auf, so muss sich die Gesamtanzahl der Datensätze ergeben.
SQL-Code:
SELECT SUM(Anzahl) AS TotalAnzahl FROM
(
select X, COUNT(*) AS Anzahl from A
group by X
)
Allerdings hat die Tabelle anscheinend keinen Primärschlüssel.
Dadurch können sehr seltsame Effekte auftreten.
Es ist z.B unmöglich mit SQL gezielt und 100% sicher einen Datensatz zu löschen oder zu ändern.
Wenn in der Tabelle mehrfach gleiche Datensätze vorhanden sind, dann kann man sie mit einer Where-Bedingung nicht unterscheiden.

Schlussfolgerung:
die Tabelle ist defekt (!) und sollte nicht ohne Primarschlüssel bleiben.

baumina 16. Mai 2013 11:47

AW: Berechnungsfehler ?
 
Zitat:

Zitat von haentschman (Beitrag 1215510)
Zu meiner Verteidigung: Ist nicht meine DB.
Diese Tabelle, bzw. ihr Inhalt, ist nicht korrekt. Ich mache eine Analyse. Die Tabelle enthällt doppelte bzw. mehrfache identische Datensätze. Jeder Datensatz hat keine eindeutige ID. Ursprünglich sollte er in sich eindeutig sein.

Er macht das schon, sx2008, dazu hatte er ja uns und den Kaffee :-D

haentschman 16. Mai 2013 11:49

AW: Berechnungsfehler ?
 
Zitat:

Es ist z.B unmöglich mit SQL gezielt und 100% sicher einen Datensatz zu löschen oder zu ändern.
...das ist definitiv klar. Ich bin erst mal auf der Suche nach der Ursache für die fehlerhaften Daten. Die müssen ja dahin gekommen sein.

Zum Verständnis:
- Die Tabelle enthält nur Vorgaben die vom Programm lesend gebraucht werden. Sollten sich die Vorgaben ändern wurde in Vergangenheit (via Update) die komplette Tabelle neu aufgebaut. Irgend etwas ist aber schief gelaufen.


Alle Zeitangaben in WEZ +1. Es ist jetzt 07:41 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz