Ich habe die folgende Tabelle mit Autos. Die Leute haben ein Standardauto, aber manchmal (wenn ein Auto in eine Garage fährt oder beschädigt ist) bekommen sie ein anderes Auto. In meinem Land muss man für das Fahren eines Firmenwagens Steuern zahlen, daher ist es wichtig, wann ein Auto gefahren wird und welches Auto gefahren wird. Wenn das Ersatzauto ein billigeres Auto ist, zahlen Sie in diesem Zeitraum weniger Steuern.
Der Tisch ist nicht so schwer:
CREATE TABLE dbo.CARUSAGE
(
ID int IDENTITY(1,1) NOT NULL,
StartDate datetime NULL,
EndDate datetime NULL,
CarID int NULL,
UserID int NULL,
TypeID int NULL
);
INSERT dbo.CARUSAGE (StartDate, EndDate, CarID, UserID, TypeID)
VALUES ('2020-04-19', NULL, 2, 2606, 1)
,('2020-07-07', '2020-10-07', 3, 2606, 2)
,('2020-10-12', '2020-10-31', 4, 2606, 2)
TypeIDs:
TypeID 1 = Standard.
TypID 2 = Ersatz.
Standardautos sind wie ein Faden. Sie haben immer ein Standardauto, es sei denn, Sie verwenden ein Ersatzauto.
Das EndDate-Standardauto ist NULL, wenn es noch fährt.
Ich möchte eine Ergebnismenge wie diese erzielen:
+----------+--------+---------+---------+-------------+-------------+
| NewID | CarID | UserID | TypeID | StartDate | EndDate |
+----------+--------+---------+---------+-------------+-------------+
| 1 | 2 | 2606 | 1 | 2020-04-19 | 2020-07-06 |
| 2 | 3 | 2606 | 2 | 2020-07-07 | 2020-10-06 |
| 3 | 2 | 2606 | 1 | 2020-10-07 | 2020-10-11 |
| 4 | 4 | 2606 | 2 | 2020-10-12 | 2020-10-30 |
| 5 | 2 | 2606 | 1 | 2020-10-31 | GetDate() |
| | | | | | |
+----------+--------+---------+---------+-------------+-------------+
Eine zusätzliche Frage basierend auf oben:
Obwohl GMB meine Frage sehr gut beantwortet hat, habe ich vergessen, eines zu erwähnen, was die Abfrage etwas komplizierter macht.
Es ist möglich, ein neues "Standard" -Auto hinzuzufügen. Wenn ein neues "Standard" -Auto hinzugefügt wird, erhält das ursprüngliche "Standard" -Auto ein Enddatum. Die Quelltabelle sieht folgendermaßen aus:
INSERT dbo.CARUSAGE (StartDate, EndDate, CarID, UserID, TypeID)
VALUES ('2020-04-19', '2020-11-04', 2, 2606, 1)
,('2020-07-07', '2020-10-07', 3, 2606, 2)
,('2020-10-12', '2020-10-31', 4, 2606, 2)
,('2020-11-05', null, 5, 2606, 1)
,('2020-11-09', '2020-11-14', 6, 2606, 2)
Der Prozess muss der gleiche sein. Es gibt immer ein "Standard" -Auto. Das ausgewählte Ergebnis würde so aussehen
+----------+--------+---------+---------+-------------+-------------+
| NewID | CarID | UserID | TypeID | StartDate | EndDate |
+----------+--------+---------+---------+-------------+-------------+
| 1 | 2 | 2606 | 1 | 2020-04-19 | 2020-07-06 |
| 2 | 3 | 2606 | 2 | 2020-07-07 | 2020-10-06 |
| 3 | 2 | 2606 | 1 | 2020-10-07 | 2020-10-11 |
| 4 | 4 | 2606 | 2 | 2020-10-12 | 2020-10-30 |
| 5 | 2 | 2606 | 1 | 2020-10-31 | 2020-11-04 |
| 6 | 5 | 2606 | 1 | 2020-11-05 | 2020-11-08 |
| 7 | 6 | 2606 | 2 | 2020-11-09 | 2020-11-13 |
| 8 | 5 | 2606 | 1 | 2020-11-14 | GetDate() |
+----------+--------+---------+---------+-------------+-------------+
Danke im Voraus.
Wenn ich Ihnen richtig folge, können Sie das Start- und Enddatum aufheben und die "Lücken" mit Ersatzdatensätzen füllen, wie folgt:
select t.carid, c.userid,t.typeid, t.dt as startdt,
lead(dateadd(day, -1, t.dt), 1, convert(date, getdate())) over(partition by c.userid order by t.dt) as enddt
from carusage c
cross apply (select carid from carusage c1 where c1.userid = c.userid and c1.typeid = 1) s
cross apply (values (c.startdate, c.typeid, c.carid), (c.enddate, 1, s.carid)) t(dt, typeid, carid)
where t.dt is not null
order by t.dt
carid | Benutzer-ID | typeid | startdt | enddt ----: | -----: | -----: | : ---------------------- | : ---------------------- 2 | 2606 | 1 | 2020-04-19 00: 00: 00.000 | 2020-07-06 00: 00: 00.000 3 | 2606 | 2 | 2020-07-07 00: 00: 00.000 | 2020-10-06 00: 00: 00.000 2 | 2606 | 1 | 2020-10-07 00: 00: 00.000 | 2020-10-11 00: 00: 00.000 4 | 2606 | 2 | 2020-10-12 00: 00: 00.000 | 2020-10-30 00: 00: 00.000 2 | 2606 | 1 | 2020-10-31 00: 00: 00.000 | 2020-11-20 00: 00: 00.000
Dieser Artikel stammt aus dem Internet. Bitte geben Sie beim Nachdruck die Quelle an.
Bei Verstößen wenden Sie sich bitte [email protected] Löschen.
Lass mich ein paar Worte sagen