2017-04-26 2 views
0

Ich habe eine gespeicherte SQL-Prozedur Abfrage-Ergebnis wie folgt aus (siehe unten)Aliasing SQL Spaltenfeld mit Datumsfunktionen

EmpID FirstName Dept  JoinDate Code1  Code2 Code3 Code4 
01  aaa  service  2017-02-11  0  2  3  5 
02  bbb  customerCare 2010-01-23  1  4  7  9 
03  ccc  Receptionist 2009-12-20  2  5  1  8 

Alle diese Felder aus differnet Tabellen entnommen werden, indem sie mit einer Bedingung verbinden. (Ich habe ein geschaffenes Wählen Sie die gespeicherte Prozedur aus, um diesen ersten Wochentag jedes Monats auszuführen)

Meine Anforderung ist, ich möchte alle Code-Felder zum Startdatum ersetzen. Zum Beispiel

Wenn ich diese gespeicherte Prozedur am 1. März ausführen 2017, sollte das Ergebnis wie dies

EmpID FirstName Dept  JoinDate 2016-12-01 2017-01-01 2017-02-01 2017-03-01     
01  aaa  service  2017-02-11 0  2  3  5 
02  bbb  customerCare 2010-01-23 1  4  7  9 
03  ccc  Receptionist 2009-12-20 2  5  1  8 

example2 aussehen werden: Wenn ich diese gespeicherte Prozedur am 1. April 2017 ausführen, sollte das Ergebnis sein sehen wie folgt aus

*

EmpID FirstName Dept JoinDate  2017-01-01 2017-02-01 2017-03-01 2017-04-01 
    01 aaa  service 2017-02-11   0  2   3   5 
    02 bbb  customerCare 2010-01-23 1  4   7   9 
    03 ccc  Receptionist 2009-12-20 2  5   1   8 

*

Das menas,

  • code4 Feld Aliasname des aktuellen Monats

  • code3 Feld Aliasname des aktuellen Monats-1

  • code2 Feld Aliasname sein erster Tag sollte sein erster Tag sollte erster Tag des laufenden Monats sein sollte-2

  • code1 Feld sollte Aliasname erster Tag des aktuellen Monats-3 seine

Wie kann ich das tun? Ich verwende SQL Server 2014. Ich konnte nicht finden, wie man den Feldnamen mit dem Datum alias annimmt, wenn wir mehrere Tabellen in sql Server verbinden. Bitte helfen Sie mir. Danke, dass Sie sich die Zeit genommen haben, meine Frage zu lesen, und dass Sie sich sehr für Ihre Hilfe bedanken.

+0

Sie werden wahrscheinlich dynamische SQL mit einem PIVOT verwenden müssen, um die Monats Zeilen zu Spalten zu ändern. – EMUEVIL

+0

nur dynamische Abfrage benötigt – DhruvJoshi

+0

@DhruvJoshi du hast Recht. Sie könnten einfach DATEADD verwenden, um die Werte zu erhalten. – EMUEVIL

Antwort

2

Geben Sie etwas wie folgt in Ihre gespeicherte Prozedur ein. Dadurch erhalten Sie das aktuelle Datum, den ersten Monat und die letzten 3 Monate. Nur Sub in Ihrer eigenen Tabelle. Sie müssen den Rest Ihrer Abfrage in die Zeichenfolge Dynamic SQL @query sowie in die Spalten ohne Code einfügen. Lass es mich wissen, wenn du Hilfe brauchst.

DECLARE @code4 date; SET @code4 = CAST(DATEADD(DAY,(DATEPART(DAY, GETDATE()-1)) * -1, GETDATE()) AS date) 
DECLARE @code3 date; SET @code3 = DATEADD(MM, -1, @code4) 
DECLARE @code2 date; SET @code2 = DATEADD(MM, -2, @code4) 
DECLARE @code1 date; SET @code1 = DATEADD(MM, -3, @code4) 

DECLARE @query NVARCHAR(MAX); 
DECLARE @selects NVARCHAR(MAX); 
set @selects = 'code1 AS [' + CAST(@code1 as nvarchar) + '], code2 AS [' + CAST(@code2 as nvarchar) + '], code3 AS [' + CAST(@code3 as nvarchar) + '], code4 AS [' + CAST(@code4 as nvarchar) + ']' 
set @query = 'SELECT ' + @selects + ' FROM [dbo].[myTable]' 

EXEC(@query) 
+0

Vielen Dank .. Ich werde dies versuchen und lassen Sie kow – Anj

+0

Es funktionierte perfekt ..Danke sehr sehr EMUEVIL – Anj

+0

@Anj Great! froh das zu hören. – EMUEVIL

1
IF Object_ID('tempdb..#temp') IS NOT NULL 
Drop table #temp 

;WITH cte(EmpID,FirstName, Dept,JoinDate,Code1, Code2,Code3,Code4) 
AS 
(
SELECT 01, 'aaa', 'service'  ,'2017-02-11',0, 2, 3, 5 union all 
SELECT 02, 'bbb', 'customerCare' , '2010-01-23',1, 4, 7, 9 union all 
SELECT 03, 'ccc', 'Receptionist' , '2009-12-20',2, 5, 1, 8 
) 
SELECT * INTO #temp FROM cte 


DECLARE @Currentmonth DATE='2017-03-01',--Change date like 2017-04-01,2017-03-01 
@AllDAtes VARCHAR(100), 
@Lastmonth DATE,  
@LastBeforemonth DATE, 
@LastBeforemonth2 DATE, 
@query NVARCHAR(MAX), 
@selects NVARCHAR(MAX); 

DECLARE @Lastmonths TABLE (Currentmonth DATE,Lastmonth DATE,LastBeforemonth DATE,LastBeforemonth2 DATE) 
INSERT INTO @Lastmonths 

SELECT @Currentmonth AS Currentmonth, 
    DATEADD(month, -1, DATEADD(day, 1 - day(@Currentmonth), @Currentmonth))AS Lastmonth, 
    DATEADD(month, -2, DATEADD(day, 1 - day(@Currentmonth), @Currentmonth))AS LastBeforemonth, 
    DATEADD(month, -3, DATEADD(day, 1 - day(@Currentmonth), @Currentmonth))AS LastBeforemonth2 

SET @[email protected] 
SELECT @Lastmonth= Lastmonth ,@LastBeforemonth= LastBeforemonth,@LastBeforemonth2=LastBeforemonth2 FROM @Lastmonths 

SET @selects = 'code1 AS [' + CAST(@LastBeforemonth2 as nvarchar) + '], code2 AS [' + CAST(@LastBeforemonth as nvarchar) + '], code3 AS [' + CAST(@Lastmonth as nvarchar) + '], code4 AS [' + CAST(@Currentmonth as nvarchar) + ']' 

SET @query = 'SELECT EmpID,FirstName, Dept,JoinDate , ' + @selects + ' FROM #temp' 

EXEC (@query) 
+0

@Anji Try meine Abfrage von Monat ändern Nummer wie 4,3 erhalten Sie Spaltennamen dynamisch Wie Sie erwartet –

+0

Vielen Dank Srini .Ich werde dies versuchen – Anj

+0

Vielen Dank Srini ... Ich nahm etwas Code von Ihnen und emuevil .. Vielen Dank. Es war so, wie ich es wollte – Anj