Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Tabelle um Spalte erweitern und mit berechneten Werten füllen (https://www.delphipraxis.net/185586-tabelle-um-spalte-erweitern-und-mit-berechneten-werten-fuellen.html)

RWarnecke 22. Jun 2015 10:54

Datenbank: SQLite • Version: 3.x • Zugriff über: ----

Tabelle um Spalte erweitern und mit berechneten Werten füllen
 
Hallo zusammen,

ich habe zwei Tabellen, die in Abhänigkeit sind in einer SQLite3 Datenbank.

Tabelle 1:
Spalte1Spalte2Spalte3
1Wert1310
2Wert1235
3Wert1310
4Wert2235
5Wert2310
6Wert2235
7Wert3310
8Wert3235

Tabelle 2:
Spalte1Spalte2
Wert11500
Wert21250
Wert31000

In Tabelle 1 soll jetzt eine Spalte 4 hinzugefügt werden und dann möchte ich mit einem oder mehreren SQL-Befehl(en) einen Wert für die Spalte 4 errechnen. Beispiel für Wert 1 aus Tabelle 1 :

Zeile 1 --> 1500 - 310 = 1190
Zeile 2 --> 1190 - 235 = 955
Zeile 3 --> 955 - 310 = 645

Die ausgerechneten Werte sollen dann jeweils in Spalte 4 der Tabelle 1 eingetragen werden. Das soll natürlich auch für Wert 2 und 3 gemacht werden. Ist dieses mit SQL-Befehlen möglich oder muß ich das ganze im Quelltext der Anwendung programmieren ?

himitsu 22. Jun 2015 11:14

AW: Tabelle um Spalte erweitern und mit berechneten Werten füllen
 
Du kannst Spalten aus anderen Tabellen via JOIN oder als Sub-SELECT aufnehmen,
oder du benutzt ein CalcField und baust es in das DataSet ein.

SQL-Code:
SELECT A1, A2, (B1 - A1) AS Bx
FROM A
JOIN B ON ...

SELECT A1, A2, (SELECT B1 - A1 FROM B WHERE ...) AS Bx
FROM A

RWarnecke 22. Jun 2015 13:01

AW: Tabelle um Spalte erweitern und mit berechneten Werten füllen
 
Das sind doch nur ganz normale Select-Anweisungen. Mein Ergebnis nach dem/den SQL-Befehl(en) soll so aussehen :

Spalte1Spalte2Spalte3Spalte4
1Wert13101190
2Wert1235955
3Wert1310645
4Wert22351015
5Wert2310705
6Wert2235470
7Wert3310690
8Wert3235455

Stelle ich die Frage anders. Kann ich einen INSERT INTO Befehl so aufbauen, dass er mir die Spalte 4 so aufbaut, wie in der Tabelle ? Wenn ja, wie muss das gemacht werden ?

mkinzler 22. Jun 2015 13:07

AW: Tabelle um Spalte erweitern und mit berechneten Werten füllen
 
Sollte durch Update gehen

SQL-Code:
update tabelle1 t1
  set spalte4 = (select spalte2 from tabelle2 t2 where t2.spalte1 = t1.spalte) - t1.spalte3;

RWarnecke 22. Jun 2015 13:39

AW: Tabelle um Spalte erweitern und mit berechneten Werten füllen
 
Hallo Markus,

ich habe Dein Update-Befehl ausprobiert. Leider bringt er nicht das gewünschte Ergebnis. Der Wert aus Tabelle 2 (Beispiel: 1500) soll nur bei der ersten Subtrahierung genommen werden. Beim zweiten Mal soll der Wert genommen werden, der durch das Update in Spalte 4 der ersten Tabelle eingefügt wurde.

Olli73 22. Jun 2015 13:54

AW: Tabelle um Spalte erweitern und mit berechneten Werten füllen
 
Zitat:

Zitat von RWarnecke (Beitrag 1306118)
ich habe Dein Update-Befehl ausprobiert. Leider bringt er nicht das gewünschte Ergebnis. Der Wert aus Tabelle 2 (Beispiel: 1500) soll nur bei der ersten Subtrahierung genommen werden. Beim zweiten Mal soll der Wert genommen werden, der durch das Update in Spalte 4 der ersten Tabelle eingefügt wurde.

Ungetestet (also "so ungefähr"):

Code:
update tabelle1 t1
   set t1.spalte4 = (select t2.spalte2 from tabelle2 t2 where t2.spalte1 = t1.spalte2) - (select sum(t3.spalte3) from tabelle1 t3 where t3.spalte2 = t1.spalte2 and t3.spalte1 <= t1.spalte1);

jobo 23. Jun 2015 06:18

AW: Tabelle um Spalte erweitern und mit berechneten Werten füllen
 
Also ich glaube nicht, dass das so ohne weiteres geht (mit sqLite)
1. Die Anforderung benötigt im Prinzip Window Functions, was sqLite nicht besitzt (gibt glaub ich ein Mod, das etwas davon umsetzt)
2. Man bräuchte zum Verzicht auf die Window Fuctions noch genauere Angaben zu den Werten (Sortierung, Anzahl) Also ist das was man sieht, aufsteigend, lückenlos usw. garantiert oder "Zufall"
3. Ich frage mich nach dem Sinn. Du baust im Grunde gezielt eine funktionale Beziehung zwischen Daten ein. Das ist Denormalisierung, das will man nicht. Außer aus Performancegründen vielleicht, dann muss man es aber absichern oder regulieren, dass die Werte beliebig neu berechnet werden können oder oder

frankyboy1974 23. Jun 2015 08:15

AW: Tabelle um Spalte erweitern und mit berechneten Werten füllen
 
Hallo,

ich mag mich täuschen, aber ich würde sagen, dies ist mit einem einzigen deskriptiven SQL-Statement nicht möglich. Dass man das Ergebnis der einen Zeile, als Zwischenergebnis speichert und mit diesem Ergebnis dann in der nächsten Ergebniszeile weiterrechnet, ist meines Wissens nicht SQL-konform. Meine letzte SQL-Schulung ist zwar schon ein paar Jahre (Jahrzehnte) her, aber ich würde sagen nein. Mit Datenbankprogrammierung bzw. Delphiprogrammierung sollte das Problem aber einfach zu lösen sein. Falls ich mich geirrt habe, würde ich mich freuen, wenn mich jemand korrigiert (Man lernt nie aus).

mfg

Frank

ibp 23. Jun 2015 10:05

AW: Tabelle um Spalte erweitern und mit berechneten Werten füllen
 
kann SQLLite StoredProcedure? Dann mach das damit.

oder ein Denkanstoß...
Zitat:

Zeile 1 --> 1500 - 310 = 1190
Zeile 2 --> 1190 - 235 = 955
Zeile 3 --> 955 - 310 = 645

ist das gleiche wie...., damit brauchst du keinen Zwischenspeicher für das Ergebnis der vorausgegangenen Zeile...

Code:
Zeile 1 --> 1500              -  310 = 1190
Zeile 2 --> 1500 - 310        -  235 = 955
Zeile 3 --> 1500 - 310 - 235  -  310 = 645

user0815 23. Jun 2015 10:24

AW: Tabelle um Spalte erweitern und mit berechneten Werten füllen
 
Oder eine View erstellen & damit weiter arbeiten ?

SQL-Code:
SELECT t1.Spalte1, t1.Spalte2, t1.Spalte3, t2.Spalte2 AS Wert, (t2.Spalte2 - t1.Spalte3) AS Rest
FROM Tabelle1 t1
LEFT JOIN Tabelle2 t2 ON t1.Spalte2 = t2.Spalte1

ibp 23. Jun 2015 11:01

AW: Tabelle um Spalte erweitern und mit berechneten Werten füllen
 
Ansatz, baut auf meinem vorigen Beitrag auf...
SQL-Code:
select
t2.spalte2
,(select sum(ts.spalte3)
from tabelle1 ts
where ts.spalte1 < (t1.spalte1)
) as Summe
,t1.spalte3
from tabelle1 t1
left join tabelle2 t2 on (t2.spalte1 = t1.spalte2)
where t1.spalte2 = 'Wert1'
order by t1.spalte1
Ergebnis:
Code:
Spalte2  Summe   Spalte3
1500     <null>  310
1500     310      235
1500     545      310
nur das Ergebnis...
SQL-Code:
select
t2.spalte2 -
   (select sum(ts.spalte3) from tabelle1 ts where ts.spalte1 <= t1.spalte1)
from tabelle1 t1
left join tabelle2 t2 on (t2.spalte1 = t1.spalte2)
where t1.spalte2 = 'Wert1'
order by t1.spalte1
Das Prinzip sollte klar sein, den Rest bekommst du schon hin...

ibp 23. Jun 2015 11:35

AW: Tabelle um Spalte erweitern und mit berechneten Werten füllen
 
für die ganze Tabelle... geht es auch mit einem Statement...

SQL-Code:
select
t1.spalte1,
t1.spalte2,
t1.spalte3,
t2.spalte2 -
   (select sum(ts.spalte3) from tabelle1 ts where (ts.spalte1 <= t1.spalte1) and (ts.spalte2=t1.spalte2))
as spalte4
from tabelle1 t1
left join tabelle2 t2 on (t2.spalte1 = t1.spalte2)
order by t1.spalte1
immer in Mengen denken :wink:

frankyboy1974 23. Jun 2015 12:24

AW: Tabelle um Spalte erweitern und mit berechneten Werten füllen
 
hallo,

@idb
ich sehe in deiner Abfrage noch nicht einmal, wo irgendwelche Datensätze aktualisiert werden. Der TE wollte wissen, ob er mit einem SQL Statement, die Daten aktualisieren kann. Ohne es ausprobiert zu haben, würde ich sagen, das dein SQL-Statement auch noch nicht einmal die richtigen Werte liefert. Selbst wenn du dass anschliessend in der DB speichers (insert into select from).

Um deine Worte zu benutzen

immer erst überhaupt denken :lol:

mfg

frank

jobo 23. Jun 2015 13:01

AW: Tabelle um Spalte erweitern und mit berechneten Werten füllen
 
Zitat:

Zitat von frankyboy1974 (Beitrag 1306265)
immer erst überhaupt denken :lol:

Dieser Tipp ist natürlich unschlagbar!
:)

ibp 23. Jun 2015 15:05

AW: Tabelle um Spalte erweitern und mit berechneten Werten füllen
 
@frankyboy1974

ich gehe davon aus das Rolf Warnecke durchaus in der Lage ist die Transferleistung zu erbringen aus einer Select-Anweisung ein Update-Statement zu erstellen.
SQL-Code:
update tabelle1 ut1
set ut1.spalte4 =
(
select t2.spalte2 - (select sum(ts.spalte3) from tabelle1 ts where (ts.spalte1 <= t1.spalte1) and (ts.spalte2=t1.spalte2))
from tabelle1 t1
left join tabelle2 t2 on (t2.spalte1 = t1.spalte2)
where t1.spalte1 = ut1.spalte1
)
Des weiteren ist es anmaßend aus einem Verdacht heraus generell etwas als falsch darzustellen und dann auch noch beleidigende Aussagen zu treffen.

MfG IbP

BUG 23. Jun 2015 16:48

AW: Tabelle um Spalte erweitern und mit berechneten Werten füllen
 
Zitat:

Zitat von user0815 (Beitrag 1306240)
Oder eine View erstellen & damit weiter arbeiten ?

Aus Datenbankler-Sicht ist das der richtige Weg, da es Inkonsistenzen vermiedet.

Siehe auch:
Zitat:

Zitat von jobo (Beitrag 1306198)
Du baust im Grunde gezielt eine funktionale Beziehung zwischen Daten ein. Das ist Denormalisierung, das will man nicht. Außer aus Performancegründen vielleicht, dann muss man es aber absichern oder regulieren, dass die Werte beliebig neu berechnet werden können oder oder


Aber du wirst schon nen Grund haben :mrgreen:

jobo 24. Jun 2015 06:30

AW: Tabelle um Spalte erweitern und mit berechneten Werten füllen
 
Es haben sich wohl genug Hinweise bzw. Ansätze und Lösungen gesammelt, denke der TE kann das schon sinnvoll umsetzen.
Was das beste ist, kann man anhand seiner bisherigen Angaben hier nicht sagen. Ich vote dennoch blindlings für einen View.

Dejan Vu 24. Jun 2015 07:11

AW: Tabelle um Spalte erweitern und mit berechneten Werten füllen
 
Bei einer derartig gestalteten View ist der Aufwand doch O(n^2), oder genau O(n*m), wobei n die Anzahl der Zeilen und m die mittlere/maximale Länge der zu summierenden Abschnitte ist, also doch letztendlich O(n^2)

Wenn ich die Tabelle einlesen und das per Hand mache, wäre der Aufwand dagegen O(n). Wenn ich die Daten also im Speicher benötige, sollte das dann -zumindest theoretisch- schneller gehen.


Alle Zeitangaben in WEZ +1. Es ist jetzt 17:01 Uhr.

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