2016-11-08 4 views
-2

Ich arbeite im Gesundheitswesen. Unsere Daten sind meistens scheiße.TSQL - Datenmanipulation - geben Sie einen bestimmten Zeitraum ein, teilen Sie diesen Zeitraum in kleinere Zeiträume ein

https://i.stack.imgur.com/uzRX7.png

Da ich nicht erlaubt bin Bilder zu posten noch oben ist ein Link zu einem Bild, das im Grunde fasst zusammen, was im versuchend zu tun.

Zum Beispiel, ich weiß, dass Empfänger 1234 für die Kostenerstattung im Zeitraum Januar 2015 berechtigt ist - April 2015

Aus diesem Beispiel würde ich eine Reihe von Daten erhalten: 1234 01/2015 - 04/2015

Da die Zeitspanne aus VIER Monaten besteht, brauche ich die Daten, um VIER ZEILEN statt EINS anzuzeigen.

Ich brauche eine Zeile zu sein: 1234 1
I Reihe zwei sein muß: 1234 2
I Zeilen müssen drei sein: 1234 3
benötigen I vierreihige seine 1234 4

Gibt es eine Möglichkeit, dies in TSQL zu tun? Vielleicht eine knifflige TSQL-Codierung? Oder vielleicht SAS-Codierung und/oder Python-Codierung?

+1

Hallo und willkommen zu SO. Wir brauchen einige Details über Ihren Tisch, um Ihnen wirklich helfen zu können. Hier ist ein großartiger Ort, um anzufangen. http://spaghettidba.com/2015/04/24/how-to-post-at-sql-question-on-a-public-forum/ –

+0

Wenn Ihre Daten wirklich sind, wie Sie sagen, Scheiße, dann scheint es wahrscheinlich, dass jede knifflige Saitenmanipulation (die mit einer vernünftigen Anwendung einer Zahlentabelle und "CROSS APPLY" definitiv möglich ist, aber in der Tat schwierig ist) leicht mit Reihen kollidieren könnte, die nicht mit diesem exaltierten Muster übereinstimmen und auf spektakuläre Weise brechen. Eine Art der Vorverarbeitung in einer geeigneten Programmiersprache (oder SSIS, wenn Sie müssen) ist in der Regel der String-Manipulation in T-SQL vorzuziehen. –

Antwort

1

In SAS:

data want; 
    set have(rename=(Month = Month_Range)); 

    Date_Start = input(scan(Month_Range, 1,'-','O'), anydtdte.); 
    Date_End = input(scan(Month_Range, 2,'-','O'), anydtdte.); 

    do i = 0 to intck('month', Date_Start, Date_End); 
     Actual_Date = intnx('month', Date_Start, i, 0, 'B'); 
     Month  = month(Actual_Date); 
     output; 
    end; 

    format Actual_Date monyy.; 

    keep Recipient_ID Month Actual_Date; 
run; 
0

In SQL Server, vielleicht so etwas wie dieser

Declare @YourTable Table (RecipiantID int,Month varchar(25)) 
Insert Into @YourTable values 
(1234,'01/2015-04/2015') 


;with cteM(M) As (Select N From (Values(1),(2),(3),(4),(5),(6),(7),(8),(9),(10),(11),(12)) N(N)) 
    ,cteY(Y) As (Select 1899+Row_Number() over (Order By (Select NULL)) From cteM N1, cteM N2) 
    ,cteD(D) As (Select DateFromParts(Y,M,1) From cteM Cross Join cteY) 
Select A.RecipiantID 
     ,Month  = Month(B.D) 
     ,ActualMonth = Format(D,'MMM-yy') 
From @YourTable A 
Join cteD  B on D between cast(substring(Month,4,4)+'-'+left(Month,2)+'-01' as date) and cast(right(Month,4)+'-'+substring(Month,9,2)+'-01' as date) 

Returns

RecipiantID Month ActualMonth 
1234  1  Jan-15 
1234  2  Feb-15 
1234  3  Mar-15 
1234  4  Apr-15 
Verwandte Themen