2017-06-30 8 views
0

ich in einer einzigen Tabelle mehrere Zeilen wie folgt:SQL - spätestes Datum basiert auf Aktion

[id], [date1], [action1], [date2], [action2], [date3], [action3], [date4], [action4]

und für jede Zeile wollen die aktuelle Datum zurückzubringen, wenn die Aktion (die von einem einzelnen definiert Buchstabe) entspricht dem gewünschten Code.

Ich vermute, dass ich die MAX() Funktion irgendwo verwenden muss, aber nicht sicher, wie ich anfangen soll?

+1

Ihr Tischdesign ist schlecht. Kannst du es aendern? –

+0

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

Antwort

0

die Sie interessieren,

DECLARE @Date1 AS DATE 
DECLARE @Date2 AS DATE 
DECLARE @Date3 AS Date 

SET @Date1 = GETDATE() 
SET @Date2 = GETDATE() + 4 
SET @Date3 = GETDATE() -4 

SELECT 
CASE 
WHEN 
(CASE WHEN @Date1 > @Date2 THEN @Date1 ELSE @Date2 END) > @Date3 THEN 
(CASE WHEN @Date1 > @Date2 THEN @Date1 ELSE @Date2 END) ELSE @Date3 END AS result 
0

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 
Verwandte Themen