TSQL: Erstellen Sie eine Zeile pro Periode in Abhängigkeit vom Start- und Enddatum basierend auf vorhandenen Zeilen

Martin Jansen

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.

GMB

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

Demo auf DB Fiddlde :

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.

bearbeiten am
0

Lass mich ein paar Worte sagen

0Kommentare
LoginNach der Teilnahme an der Überprüfung

Verwandte Artikel

TOP Liste

  1. 1

    So verschieben Sie ein Bild in Flutter/Dart mit einem Draggable

  2. 2

    Unity Build-Fehler: Der Name 'EditorUtility' ist im aktuellen Kontext nicht vorhanden

  3. 3

    TypeAhead.js zeigt keine Ausgangsschienen an?

  4. 4

    Deklarieren einer nicht initialisierten Variablen in der Klassendefinition in Python

  5. 5

    Wie kann ich eine verschachtelte Schleife mit lapply in R ersetzen?

  6. 6

    spring-data-jpa: ORA-01795: Die maximale Anzahl von Ausdrücken in einer Liste beträgt 1000

  7. 7

    Warum funktioniert Phantomjs nicht mit dieser Site?

  8. 8

    Interpolieren Sie mit Python die 2D-Matrix entlang der Spalten

  9. 9

    numpy: Berechnen Sie die Ableitung der Softmax-Funktion

  10. 10

    Wie vermeide ich, dass die gesamte App neu geladen wird, wenn Nav.Link von React-Bootstrap verwendet wird?

  11. 11

    MongoDB eingebettetes Dokument unterscheiden und filtern

  12. 12

    Aktualisieren des Werts im Json-Objekt in Python

  13. 13

    Warum funktioniert das Umgebungslicht in diesem Beispiel nicht?

  14. 14

    Python gibt einen Fehler aus, dass eine Datei nicht vorhanden ist, wenn dies eindeutig der Fall ist

  15. 15

    Wie verwende ich Format-Table ohne Abschneiden von Werten?

  16. 16

    So berechnen Sie die Verfügbarkeit von Anwendungen (SLA)

  17. 17

    Überprüfen Sie, ob der ausgewählte Wert 'YES' ist, wenn ja, aktivieren Sie ein Steuerelement mit Javascript

  18. 18

    Python: Spalten mit demselben Namen zusammenführen, wobei der Mindestwert beibehalten wird

  19. 19

    Holen Sie sich verwandte Pillen Inhalt mit angeklickten img in Angular

  20. 20

    Eclipse Oxygen - Projekte verschwinden

  21. 21

    Wie aktualisiere ich ein Feld in einer Raumdatenbank mit einem Repository und einem Ansichtsmodell?

heißlabel

Archiv