Sie UNPIVOT
in Kombination mit Common Table Expressions (Sie können Ihre Datumsspalten statt meiner Variablen. Put) verwenden können. Nehmen wir an, Ihr Tisch ist dies:
CREATE TABLE MyTable
(
ID int NOT NULL IDENTITY PRIMARY KEY,
Date1 date NOT NULL,
Action1 char(1) NOT NULL,
Date2 date NOT NULL,
Action2 char(1) NOT NULL,
Date3 date NOT NULL,
Action3 char(1) NOT NULL,
Date4 date NOT NULL,
Action4 char(1) NOT NULL
);
Und einige Beispieldaten:
INSERT INTO MyTable(Date1, Action1, Date2, Action2, Date3, Action3, Date4, Action4)
VALUES
('20170101', 'A', '20170201', 'A', '20170201', 'B', '20170101', 'C'),
('20170103', 'A', '20170203', 'B', '20170205', 'A', '20170101', 'C');
Sie können dann UNPIVOT
für Aktionen und dann für Termine und dann kommen diese verschwenkten Ergebnisse wie folgt:
WITH Actions AS
(
SELECT ID, [Action]
FROM
(
SELECT ID, Action1, Action2, Action3, Action4
FROM MyTable
) P
UNPIVOT
(
[Action] FOR Col IN([Action1], [Action2], [Action3], [Action4])
) U
),
Dates AS
(
SELECT ID, [Date]
FROM
(
SELECT ID, Date1, Date2, Date3, Date4
FROM MyTable
) P
UNPIVOT
(
[Date] FOR Col IN([Date1], [Date2], [Date3], [Date4])
) U
)
SELECT
A.ID, MAX(D.[Date]) AS MaxDate
FROM
Actions A
INNER JOIN Dates D ON D.ID = A.ID
WHERE
A.Action = 'A'
GROUP BY
A.ID;
Das Ergebnis ist
ID MaxDate
----------- ----------
1 2017-02-01
2 2017-02-05
Ihr Tischdesign ist schlecht. Kannst du es aendern? –
Leider nicht. Jede Aktion bezieht sich auf eine eindeutige Zeile und kann zu unterschiedlichen Daten auftreten. Ich möchte bestimmte Aktionen isolieren und das letzte Datum, an dem es aufgetreten ist, durchgehen lassen – parkesmatt