2017-01-18 3 views
0

Ich versuche, eine gespeicherte Prozedur zu schreiben, die nur Daten für die letzten 3, 6, 9 Monate oder Jahr zurückgibt. Es muss nur ganze Monate sein (wenn man 8/15 zieht; das letzte wäre Juli)SQL-Parameter, der Filtereinträge innerhalb der letzten 3, 6, 9 Monate oder Jahre überprüft

Bis jetzt konnte ich herausfinden, wie man den ersten und letzten Tag des vorherigen Monats herausfinden kann.

SELECT DATEADD(m,-1,DATEADD(mm, DATEDIFF(m,0,GETDATE()), 0))as 'First day of the month', 
DATEADD(d,-1,DATEADD(mm, DATEDIFF(m,0,GETDATE()),0)) as 'Last day of the month' 

Das Feld, das für überprüft werden müssen, ist TransactionDateKey (dh 20.161.222). Ich denke, ich sollte ein CAST auf diesem Feld verwenden, um nur nach Monat und Tag zu suchen (zB 201612), aber ich könnte falsch liegen. Im Folgenden finden Sie eine grobe Mock-up von dem, was ich denke, sollte ich meine Frage auf, aber ohne die hartcodierte Daten

select FirstName + ' ' + LastName as 'Specialist', 
    empID as 'empID', 
    count(fact.spKey) as 'Count', 
    CAST(LEFT(CAST(TransactionDateKey AS VARCHAR(100)), 6) AS INT) as 'Month' 
from Final.DimSpecialist s 
    inner join Final.FactTreatmentDay fact 
     on fact.spKey = s.spKey 
where TransactionDateKey between 20161201 and 20161231 
group by FirstName + ' ' + LastName, 
    empID, 
    CAST(LEFT(CAST(TransactionDateKey AS VARCHAR(100)), 6) AS INT) 

Wie würde ich über die Vereinbarkeit eines einzelnen Parameters, @MonthRange gehen werden zu stützen, und es in der Verwendung WHERE-Klausel nur Daten für die letzten 3 Monate, 6 Monate, 9 Monate oder ein Jahr zurückgeben? Ich denke, der Parameter muss platziert werden, wo -1 am ersten Tag des Monats ist. Ich denke, es sollte auch eine Case-Anweisung geben, um nach jedem der 4 möglichen Parameterwerte zu suchen, aber ich bin mir nicht sicher, wohin es gehen soll. Jeder Rat würde sehr geschätzt werden.

Antwort

1

Ich glaube, es gibt einige interessante Möglichkeiten zur Datumsberechnungen mit einem Datum Dimension Tabelle, wo Sie ein Jahr haben Feld, habe ich beschlossen, eine Antwort, die eng entspricht, was Sie bereits haben, ist anwendbar, wenn Sie nicht haben eine Tabelle:

declare @months_to_report int; --procedure parameter 

--Validation 
if @months_to_report not in (3, 6, 9, 12) raiserror('Months to report must be one of 3, 6, 9, or 12.', 18, 1); 

--Variables 
declare @first date, @start date, @end date, @start_key int, @end_key int; 

set @first = DATEADD(m,-1,DATEADD(mm, DATEDIFF(m,0,GETDATE()), 0));  --first day of previous month 
set @end = DATEADD(d,-1,DATEADD(mm, DATEDIFF(m,0,GETDATE()),0));  --last day of previous month 
set @start = DATEADD(M, 1 - @months_to_report, @first);     --move back n-1 months to account for including previous month 

set @start_key = Year(@start) * 10000 + Month(@start) * 100 + Day(@start); --start date as keys 
set @end_key = Year(@end) * 10000 + Month(@end) * 100 + Day(@end); --end date as keys 

select @first as 'First day of the month', @start as 'First day of reporting period', @end as 'Last day of the month/reporting period', @start_key as 'Start key', @end_key as 'End key'; 

Dieser Code setzt voraus, dass der übergebene Parameter @months_to_report ist. Ich bevorzuge es, Parameter in gespeicherten Prozeduren zu validieren. Das Ende select dient nur zum Debuggen. Sie würden Ihren bereitgestellten Beispielcode ändern, um diesem zu folgen, und @ start_key und @end_key für Ihre hartcodierten Daten ergänzen.

Verwandte Themen