Neuigkeiten:

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

Mobiles Hauptmenü

sql zusammen fügen[ gestern-heute ]

Begonnen von joerg007, November 13, 2016, 19:44:32

⏪ vorheriges - nächstes ⏩

joerg007

Guten  Abend  8)

bin mir gerade den kopf am zerbrechen wie ich das hin bekommen soll !!

und zwar speicher ich den bestand und Datum in einer tabelle
täglich 1x
jetzt hätte ich aber gerne gewust welche änderung es an nächsten Tag gab

also: bestand.gestern - bestand.heute

da das aber ja 2 sql abfragen sind

SELECT tbl_Fuelstaende.Datum, tbl_Fuelstaende.Stand
FROM tbl_Fuelstaende;


SELECT tbl_Fuelstaende.Datum()-1, tbl_Fuelstaende.Stand
FROM tbl_Fuelstaende;


weis  ich wie man die am besten kombieren tut ?

besten dank schon mal
und gute nacht ! ::)

MzKlMu

Hallo,
wenn Das Datenmodell korrekt wäre, bräuchtest Du überhaupt keine Bestände abzuspeichern und könntest zu jedem beliebigen Datum den Bestand ermitteln.

Man führt die Mengen für den Bestand in einer extra Tabelle Zugänge positiv und Abgänge negativ. Der Bestand ist dann einfach die Summe. Mit dem Datum kannst Du zu jedem beliebigen Zeitpunkt den Bestand ermitteln.

Kannst Du die DB noch ändern ?
Gruß Klaus

joerg007

Ich bin noch gerade am Anfang der Datenbank

ich habe die Daten von
Eingang  täglich
Füllstand  täglich
Der ausgang ist nur durch Differenz des Tank Standes möglich

Wie sollte ich da am besten die tabbelen anlegen ?

MzKlMu

Hallo,
Zitatich habe die Daten von
Eingang  täglich
Füllstand  täglich
In welcher Form bekommst Du die Daten ?
Zwie Felder, zwei Datensätze oder wie sonst ?
Wenn Du den Eingang täglich bekommst, ist doch der Füllstand einfach die Summe, wozu dann der Füllstand noch mal extra ?
Gruß Klaus

joerg007

hi:

die daten hab ich als zwei Datensätze pro Tank

zb.
heute 80 m³ und gestern 100 m³

was ich gerne hätte wäre
der vebrauch = gestern 100m³ - heute 80m³
um die reichweite des Füllstands zu berechen

die abnahme kenn ich nicht daher soll sie täglich berecht werden

die eingänge habe ich vorliegen


MzKlMu

Hallo,
das ist die Kumulierung (laufende Summe) der Füllstände.
Siehe hierzu:
FAQ 3.11 Laufende Nummer/Summe in Abfragen
Gruß Klaus

ebs17

SELECT
   T1.Datum,
   T1.Stand,
   T2.Stand - T1.Stand AS Differenz
FROM
   tbl_Fuelstaende AS T1
      LEFT JOIN tbl_Fuelstaende AS T2
      ON T1.Datum = DateAdd("d", 1, T2.Datum)
Mit freundlichem Glück Auf!

Eberhard

joerg007

#7
genau so wollte ich es haben !!
Danke Sehr  ;)

habe blos nur noch SELECT  distinct
hinzugefügt  da ich sonst doppelte daten werte hatte   ::)


Wenn ich nun aber weiter zurück will also vorgestern ...
Muss ich da die 1 bei Dateadd erhöhen ?


ebs17

Wenn die Schrittweite für alle Tage gleich ist, dann ja.
Mit freundlichem Glück Auf!

Eberhard

crystal

Hallo joerg007,

meiner Meinung nach fehlt in der Lösung von ebs17 ein entscheidender Punkt, nämlich eine WHERE-Bedingung, z.B.
WHERE T1.Datum = <Datumseingabe>
(Einmal abgesehen davon, dass der Name "Datum" unglücklich gewählt ist).
Ohne diese Where-Bedingung erhälst du eine Liste aller Füllstände, was dir vielleicht noch nicht aufgefallen ist, weil es in deiner Test-Datenbank vielleicht zu wenig Datensätze gibt. Deshalb ja wohl auch dein Versuch mit DISTINCT.

ebs17 addiert auf T1.Datum immer genau einen Tag. D.h. du müsstest als <Datumseingabe> immer den Vortag eingeben, damit die Addition klappt.

Vielleicht wäre es besser, mit datediff einen Tag zu subtrahieren (-1), dann könntest du mit dem akuellen Datum als <Datumseingabe> arbeiten.

Eine andere Möglichkeit wäre ein
SELECT TOP 1 from...
Das würde dir immer nur 1 Datensatz liefern (Sortierung beachten).
Entsprechend würde ein
SELECT TOP 10 ...
dir die Füllstände der letzten 10 Tage liefern (Sortierung Datum absteigend).

Bitte erweitere deine Test-Tabelle um ein paar mehr Datensätze und probiere mit der Abfrage verschiedene Varianten. Du kannst dazu im Abfrage-Entwurf immer wieder zur Datenblatt-Ansicht wechseln, um die Ergebnisse deiner Änderung zu sehen (und danach einfach zurück zu Entwurfs-Ansicht, um ggf. weitere Änderungen zu machen).

Noch etwas: zu Debugging-Zwecken würde ich auch T2.Datum anzeigen.

lg
crystal

PS: ebs17 wird mich vermutlich wieder beschimpfen, aber das ist mir egal, denn seine Lösung ist nicht vollständig durchdacht.
Wer Fehler in meinen Antworten findet, darf sie behalten, muss sie aber kommentieren. ;-)
Dies ist keineswegs arrogant gemeint, sondern soll nur unterstreichen, dass meine Antworten - natürlich - nicht immer fehlerfrei sind und sein können.
Devise: bitte immer erst selbst probieren!

Aus gesundheitlichen Gründen nur noch selten dabei...

ebs17

#10
Zitat von: joerg007gestern-heute
und zwar speicher ich den bestand und Datum in einer tabelle täglich 1x

Bei DIESER Ausgangslage war mein erster Vorschlag treffend und hinreichend durchdacht - und nicht zuletzt vom TE anerkannt. Wenn man natürlich die Ausgangslage ändert und Geschichten von Marie und dem Wolf hinzufügt, dann ändern sich natürlich Dinge ...
Mit freundlichem Glück Auf!

Eberhard

crystal

<OT>
Lieber Eberhard,
kannst du oder willst du nicht begreifen, dass solche Kommentare
ZitatWenn man natürlich die Ausgangslage ändert und Geschichten von Marie und dem Wolf hinzufügt, dann ändern sich natürlich Dinge ...
absolut unsinnig sind und eher verwirren, zumindest dann, wenn sie nicht weiter erläutert und erklärt werden? Was wolltest du mit dieser Aussage bezwecken?

Würdest du dich doch endlich auf sachliche Aussagen beschränken, das wäre schön. Du bist doch ein intelligenter und in Access erfahrener Mensch, der hier auch schon sehr gute Beiträge gepostet hat. Warum verzichtest du nicht auf deine unsinnigen und unsachlichen Nebensätze, mit denen du dich oft genug des Belächelns preisgibst und der wiederholten Frage, was diese deine Antwort nun eigentlich sollte.

Dieses Forum sollte sachlich sein und bleiben, Polemik und persönliche Eitelkeiten bringen nichts.

Also bitte, lieber Eberhard, bleibe sachlich und verkneife dir alle anderen Statements.

lg
crystal
</OT>

Bitte begründe und erkläre doch, warum meine Anmerkungen zu deiner Lösung falsch sind, statt mit sie mit seltsamen Äußerungen (siehe Zitat oben) zu kommentieren und die Leute damit im Regen stehen zu lassen.

Bitte pflücke meine Anmerkungen Stück für Stück auseinander und gebe deine sachlichen Kommentare dazu ab. Ich habe die Wahrheit nicht gepachtet und wenn mir ein erfahrener Mensch - wie du - zeigt, wo und weshalb ich falsch gedacht habe, profitiere nicht nur ich davon, sondern andere Leser des Forums auch.
Wer Fehler in meinen Antworten findet, darf sie behalten, muss sie aber kommentieren. ;-)
Dies ist keineswegs arrogant gemeint, sondern soll nur unterstreichen, dass meine Antworten - natürlich - nicht immer fehlerfrei sind und sein können.
Devise: bitte immer erst selbst probieren!

Aus gesundheitlichen Gründen nur noch selten dabei...

Josef P.

[etwas OT]
@Eberhard:
Ohne über die Logik nachgedacht zu haben .- nur aufgrund der SQL-Anweisung:
SELECT
   T1.Datum,
   T1.Stand,
   T2.Stand - T1.Stand AS Differenz
FROM
   tbl_Fuelstaende AS T1
      LEFT JOIN tbl_Fuelstaende AS T2
      ON T1.Datum = DateAdd("d", 1, T2.Datum)

Aufgrund des Left-Join würde ich den On-Ausdruck umdrehen.
Auf T1 läuft sowieso ein Table/Index-Scan. Man könnte aber einen Index-Seek in T2 nutzen.

ON T2.Datum = DateAdd("d", -1, T1.Datum)

mfg
Josef

joerg007

Hi ,

so nach den ich wieder mal zeit habe habe ich es mal mit roh daten probiert und wie ich nun sehe geht das nicht so wie es soll  ich bekomme jetzt alle werte von einander jeweils abgezogen ein select distinct geht nur bei gleichen daten .

Das hatte glaub ich cystal schon vorraus gesehen !

mit der where bedingung tue ich mich aber schwer!
denn diese rechnet nicht ?


INSERT INTO tbl_Fuelstaende_verbrauch ( Tank, Heute, gestern, Stand_Heute, Stand_gestern, Produkt )
SELECT
T2.Tank,
T1.Datum,
T2.Datum,
T1.Stand,
T2.Stand - T1.Stand AS Differenz,
T2.Produkt

FROM tbl_Fuelstaende AS T2 LEFT JOIN tbl_Fuelstaende AS T1 ON T1.Datum=DateAdd("d",-1,T2.Datum)
WHERE T2.Datum  =Date()-1 ;




ebs17

#14
Zitatgenau so wollte ich es haben !!
- vs -
geht das nicht so wie es soll
Jetzt wäre es notwendig zu wissen, "was es soll", aber nur, wenn Du von außen eine Lösung brauchst.

Fragen:
- Wozu eine weitere Tabelle  mit dann redundanten Daten?
- Das oben mit dem DISTINCT kann ich nicht nachvollziehen, wenn Du pro Tag genau einen Eintrag vornimmst. Dann gibt es mit der von mir gezeigten Abfrage keine Duplikate. Also: Wie sehen Deine Daten wirklich aus?

Wenn man über alle Datensätze die Differenz zum jeweiligen Vortag berechnen will, braucht man - das sollte man in seine Überlegung einbeziehen - auch immer einen Vortag, also ein fortlaufendes Datum, also auch am Wochenende fleißig sein mit der Datenerfassung. Selbstredend erfasst die Abfrage ohne weitere Differenzierung alle Füllstände, hast Du also mehrere betrachtete Behälter, gibt es einen Wirrwarr.

@crystal: Hast Du die Aufgabe nur vollständig (nach Deinen Worten) durchdacht, oder hast Du auch mal selber einen praktischen Versuch gewagt? Durch SEHEN beantworten sich auch manchmal Fragen.

@Josef: Du hast sicher im Sinne der Effizienzsteigerung recht. Hier geht es aber erst einmal um das Funktionieren an sich, und ob es überhaupt nutzbare Indizes gibt, darf man im momentanen Zustand bezweifeln.
Trotzdem darf man Deine Variante gleich übernehmen.
Mit freundlichem Glück Auf!

Eberhard