Re: Prozedur zur Kilometerberechnung

Tech-Archive recommends: Fix windows errors by optimizing your registry



Hallo Rudolf,

rudolf.kiepetz@xxxxxxxxxx schrieb:
Liebe Profis
Leider birnd´s mich wieder mal ordentlich auf - wie wir Österreicher
auf gut Deutsch so sagen.
Das Problem:
In einer Datenbank habe ich Werte mit Kilometerständen von Fahrzeugen.
Beispiel:
Objid, Datum, Stand
4711, 2.1.05, 3500
4711, 15.1.05, 4550
4711, 29.1.05, 5800
4711, 4.2.05, 6900
4712, 5.1.05, 8005 usw..
Ich bastle nun an einer Prozedur, die mir für jeden Tag einen
Datensatz mit
objid, datum, km_stand und km_gefahren in eine Datenbank schreibt.
Bin leider nicht sehr erfolgreich dabei!!

in solchen Fällen bietet sich eine (statische) Hilfstabelle mit
Datumswerten an:

CREATE TABLE tblDatum(
Datum smalldatetime NOT NULL PRIMARY KEY
-- ggfs. noch zusätzliche Felder wie Jahr, Monat, Tag ...
-- um Auswertungen zu vereinfachen
)

Diese Tabelle befüllst du einmalig mit Datumswerten des interessierenden
Zeitraums. Hört sich erst mal nach Platzverschwendung an, aber die
Anzahl der Datensätze bleibt ja im überschaubaren (sic!) Zeitraum.

Mit der Hilfstabelle kannst du auf eine SP verzichten, man kann das
alles in ein INSERT packen:

(ich seh schon, das kann man nicht so einfach hintippen, da braucht's
ein testbares Beispiel)

USE tempdb
GO
SET NOCOUNT ON
GO

CREATE TABLE tblFahrtenbuch(
FahrtenbuchID int not null IDENTITY PRIMARY KEY,
FahrzeugID int not null,
Datum smalldatetime not null,
KM_Stand float not null
)
GO

INSERT INTO tblFahrtenbuch(FahrzeugID, Datum, KM_Stand)
SELECT 4711, '20050102', 3500 UNION ALL
SELECT 4711, '20050115', 4550 UNION ALL
-- 2.Eintrag am selben Tag?!?
SELECT 4711, '20050115', 4590 UNION ALL
SELECT 4711, '20050129', 5800 UNION ALL
SELECT 4711, '20050204', 6900
GO

CREATE TABLE tblDatum(
Datum smalldatetime not null PRIMARY KEY
)
GO

-- Datumstabelle per Schleife füllen
DECLARE @datum smalldatetime
SET @datum = '20050101'
WHILE @datum < '20060101' BEGIN
INSERT INTO tblDatum(Datum)
VALUES (@datum)
SET @datum = DateAdd(dd, 1, @datum)
END
GO

CREATE TABLE tblTagesauswertung(
FahrzeugID int NOT NULL,
Datum smalldatetime NOT NULL,
KM_Stand float NOT NULL,
KM_Gefahren float NOT NULL,
PRIMARY KEY(FahrzeugID, Datum)
)
GO

INSERT INTO tblTagesauswertung(FahrzeugID, Datum, KM_Stand, KM_Gefahren)
SELECT a.FahrzeugID, d.Datum,
a.KM_Stand +
(e.KM_Stand - a.KM_Stand)/DateDiff(dd, a.datum, e.datum)*
DateDiff(dd, a.Datum, d.Datum),
(e.KM_Stand - a.KM_Stand)/DateDiff(dd, a.datum, e.datum)
FROM tblDatum d, tblFahrtenbuch a, tblFahrtenbuch e
WHERE a.FahrtenbuchID =
-- Durch den Trick mit TOP/ORDER BY wird die Stolperfalle
-- 'gleiches Datum' umgangen.
(SELECT TOP 1 f.FahrtenbuchID FROM tblFahrtenbuch f
WHERE f.FahrzeugID = a.FahrzeugID
AND f.Datum <= d.Datum
ORDER BY f.Datum DESC, f.KM_Stand)
AND e.FahrtenbuchID =
(SELECT TOP 1 f.FahrtenbuchID FROM tblFahrtenbuch f
WHERE f.FahrzeugID = e.FahrzeugID
AND f.Datum > d.Datum
ORDER BY f.Datum ASC, f.KM_Stand)
GO
SELECT * FROM tblTagesauswertung
GO

DROP TABLE tblTagesauswertung
GO
DROP TABLE tblFahrtenbuch
GO
DROP TABLE tblDatum
GO

Gruß
Hannes
.



Relevant Pages

  • =?Utf-8?Q?Re:_Doppelte_Eintr=C3=A4ge_filter?=
    ... "Peter Doering" wrote: ... >>> Du brauchst nur das eine gegen das andere Datum austauschen. ... > SELECT Computer, SWProfil, Version, VerteilDatum ... > (SELECT Max(T2.VerteilDatum) ...
    (microsoft.public.de.access)
  • =?iso-8859-1?Q?Re:_Anf=FCgen_von_Daten_aus_SQL-SERVER-TABELLE_in_ACCESS-T?= =?is
    ... Feldnamen; datum, id, bereich*/ ... SELECT getdate AS Datum, ... Die Aceess Datei musst Du natürlich nach den Vorgaben erstellen, und auch den Speicherpfad zur Accessdatei im Script anpassen. ... Tabelle und Feldnamen müssen existieren. ...
    (microsoft.public.de.sqlserver)
  • Re: SQL Abfrage
    ... uid int NOT NULL IDENTITY PRIMARY KEY, ... Name varcharNOT NULL ... SELECT 'Uwe' ... FROM dbo.tblMandanten m LEFT JOIN dbo.tblUserMandanten um ...
    (microsoft.public.de.sqlserver)
  • Re: Doppelte =?iso-8859-1?Q?Eintr=E4ge?= filter
    ... >> Du brauchst nur das eine gegen das andere Datum austauschen. ... SELECT Computer, SWProfil, Version, VerteilDatum ... FROM Tab1 AS T1 ...
    (microsoft.public.de.access)
  • Re: Abfrage
    ... Datum und Autorenname und verwende ... (select berichte2.lfd_nr from berichte inner join berichte2 ... FROM berichte2 AS T1 ... WHERE NOT EXISTS ...
    (microsoft.public.de.access)