Re: Prozedur zur Kilometerberechnung
- From: Hannes Brunner <bruhan12@xxxxxx>
- Date: Tue, 27 May 2008 14:06:12 +0200
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
.
- References:
- Prozedur zur Kilometerberechnung
- From: rudolf . kiepetz
- Prozedur zur Kilometerberechnung
- Prev by Date: Re: Wie umgehe ich die Fehlermeldung: Der Abfrageprozessor hatte während der Abfrageoptimierung zu wenig Stapelspeicherplatz.
- Next by Date: Re: Wie umgehe ich die Fehlermeldung: Der Abfrageprozessor hatte während der Abfrageoptimierung zu wenig Stapelspeicherplatz.
- Previous by thread: Re: Prozedur zur Kilometerberechnung
- Next by thread: Probleme mit Datenbank(en)
- Index(es):
Relevant Pages
|