2016-12-23 1 views
2

ich ein BeispieldatenWie Nullwerte mit über Zeilendaten füllen

DECLARE @Table TABLE(
     ID INT, 
     Mon VARCHAR(10), 
     Dt DateTime 
) 

INSERT INTO @Table (ID,Mon,Dt) SELECT 1, 'Jan','2016-12-23 21:08:22.280' 
INSERT INTO @Table (ID,Mon,Dt) SELECT 2, 'Feb',NULL 
INSERT INTO @Table (ID,Mon,Dt) SELECT 3, 'Mar',NULL 
INSERT INTO @Table (ID,Mon,Dt) SELECT 4, 'Apr',NULL 
INSERT INTO @Table (ID,Mon,Dt) SELECT 5, 'May',NULL 
INSERT INTO @Table (ID,Mon,Dt) SELECT 6, 'Jun',NULL 
INSERT INTO @Table (ID,Mon,Dt) SELECT 7, 'Jul',NULL 
INSERT INTO @Table (ID,Mon,Dt) SELECT 8, 'Aug',NULL 
INSERT INTO @Table (ID,Mon,Dt) SELECT 9, 'Sep',NULL 
INSERT INTO @Table (ID,Mon,Dt) SELECT 10, 'Oct',NULL 
INSERT INTO @Table (ID,Mon,Dt) SELECT 11, 'Nov',NULL 
INSERT INTO @Table (ID,Mon,Dt) SELECT 12, 'Dec',NULL 
INSERT INTO @Table (ID,Mon,Dt) SELECT 1, 'Jan','2017-12-23 21:08:22.280' 
INSERT INTO @Table (ID,Mon,Dt) SELECT 2, 'Feb',NULL 
INSERT INTO @Table (ID,Mon,Dt) SELECT 3, 'Mar',NULL 
INSERT INTO @Table (ID,Mon,Dt) SELECT 4, 'Apr',NULL 
INSERT INTO @Table (ID,Mon,Dt) SELECT 5, 'May',NULL 
INSERT INTO @Table (ID,Mon,Dt) SELECT 6, 'Jun',NULL 
INSERT INTO @Table (ID,Mon,Dt) SELECT 7, 'Jul',NULL 
INSERT INTO @Table (ID,Mon,Dt) SELECT 8, 'Aug',NULL 
INSERT INTO @Table (ID,Mon,Dt) SELECT 9, 'Sep',NULL 
INSERT INTO @Table (ID,Mon,Dt) SELECT 10, 'Oct',NULL 
INSERT INTO @Table (ID,Mon,Dt) SELECT 11, 'Nov',NULL 
INSERT INTO @Table (ID,Mon,Dt) SELECT 12, 'Dec',NULL 

Select * from @Table

Giving Ergebnis als

ID Mon Dt 
1 Jan 2016-12-23 21:08:22.280 
2 Feb NULL 
3 Mar NULL 
4 Apr NULL 
5 May NULL 
6 Jun NULL 
7 Jul NULL 
8 Aug NULL 
9 Sep NULL 
10 Oct NULL 
11 Nov NULL 
12 Dec NULL 
1 Jan 2017-12-23 21:08:22.280 
2 Feb NULL 
3 Mar NULL 
4 Apr NULL 
5 May NULL 
6 Jun NULL 
7 Jul NULL 
8 Aug NULL 
9 Sep NULL 
10 Oct NULL 
11 Nov NULL 
12 Dec NULL 

Wie kann ich so

haben bekommen
id mon dt 
1 Jan 2016-01-23 21:08:22.280 
2 Feb 2016-02-23 21:08:22.280 
3 Mar 2016-03-23 21:08:22.280 
4 Apr 2016-04-23 21:08:22.280 
5 May 2016-05-23 21:08:22.280 
6 Jun 2016-06-23 21:08:22.280 
7 Jul 2016-07-23 21:08:22.280 
8 Aug 2016-08-23 21:08:22.280 
9 Sep 2016-09-23 21:08:22.280 
10 Oct 2016-10-23 21:08:22.280 
11 Nov 2016-11-23 21:08:22.280 
12 Dec 2016-12-23 21:08:22.280 
1 Jan 2017-01-23 21:08:22.280 
2 Feb 2017-02-23 21:08:22.280 
3 Mar 2017-03-23 21:08:22.280 
4 Apr 2017-04-23 21:08:22.280 
5 May 2017-05-23 21:08:22.280 
6 Jun 2017-06-23 21:08:22.280 
7 Jul 2017-07-23 21:08:22.280 
8 Aug 2017-08-23 21:08:22.280 
9 Sep 2017-09-23 21:08:22.280 
10 Oct 2017-10-23 21:08:22.280 
11 Nov 2017-11-23 21:08:22.280 
12 Dec 2017-12-23 21:08:22.280 

Empfehlen Sie

+2

Beachten Sie, dass Sie die mehr succint verwenden können (und schneller!) 'INSERT INTO (...) VALUES (1), (2), (3), ...' Syntax statt 'INSERT SELECT INSERT SELECT' . – Dai

+1

Welche Version von SQL Server verwenden Sie? –

+0

sql server2012 @Prdp – mohan111

Antwort

4

Versuchen Sie, diese

SELECT ID, 
     Mon, 
     Dateadd(mm, id - 1, Min(Dateadd(mm, -Month(dt) + 1, dt))OVER(partition BY rn)) dt 
FROM (SELECT Row_number()OVER(partition BY Mon ORDER BY id) rn,* 
     FROM @Table) a 
ORDER BY dt 

Ergebnis:

╔════╦═════╦═════════════════════════╗ 
║ ID ║ Mon ║   dt   ║ 
╠════╬═════╬═════════════════════════╣ 
║ 1 ║ Jan ║ 2016-01-23 21:08:22.280 ║ 
║ 2 ║ Feb ║ 2016-02-23 21:08:22.280 ║ 
║ 3 ║ Mar ║ 2016-03-23 21:08:22.280 ║ 
║ 4 ║ Apr ║ 2016-04-23 21:08:22.280 ║ 
║ 5 ║ May ║ 2016-05-23 21:08:22.280 ║ 
║ 6 ║ Jun ║ 2016-06-23 21:08:22.280 ║ 
║ 7 ║ Jul ║ 2016-07-23 21:08:22.280 ║ 
║ 8 ║ Aug ║ 2016-08-23 21:08:22.280 ║ 
║ 9 ║ Sep ║ 2016-09-23 21:08:22.280 ║ 
║ 10 ║ Oct ║ 2016-10-23 21:08:22.280 ║ 
║ 11 ║ Nov ║ 2016-11-23 21:08:22.280 ║ 
║ 12 ║ Dec ║ 2016-12-23 21:08:22.280 ║ 
║ 1 ║ Jan ║ 2017-01-23 21:08:22.280 ║ 
║ 2 ║ Feb ║ 2017-02-23 21:08:22.280 ║ 
║ 3 ║ Mar ║ 2017-03-23 21:08:22.280 ║ 
║ 4 ║ Apr ║ 2017-04-23 21:08:22.280 ║ 
║ 5 ║ May ║ 2017-05-23 21:08:22.280 ║ 
║ 6 ║ Jun ║ 2017-06-23 21:08:22.280 ║ 
║ 7 ║ Jul ║ 2017-07-23 21:08:22.280 ║ 
║ 8 ║ Aug ║ 2017-08-23 21:08:22.280 ║ 
║ 9 ║ Sep ║ 2017-09-23 21:08:22.280 ║ 
║ 10 ║ Oct ║ 2017-10-23 21:08:22.280 ║ 
║ 11 ║ Nov ║ 2017-11-23 21:08:22.280 ║ 
║ 12 ║ Dec ║ 2017-12-23 21:08:22.280 ║ 
╚════╩═════╩═════════════════════════╝ 
+1

gut @Prdp .. –

+0

@vkp konzentrieren sollte - Dank bro .. –

+0

@Prdp es gibt nicht 2017 Ergebnis mich in meinem Code @Prdp – mohan111

2

ich das annehmen kann, was Sie wollen:

select id, mon, 
     coalesce(dt, min(dt) over()) as dt 
from @table; 

Dies wird vorausgesetzt, dass Sie tun möchten, ist bevölkern die NULL Werte mit dem minimalen Datum/Uhrzeit in der Spalte mn.

EDIT:

Die überarbeitete Version erhöht den Monat:

select id, mon, 
     coalesce(dt, dateadd(month, id - 1, min(dt) over())) as dt 
from @table; 
+0

ich die Frage geändert haben, können Sie bitte, dass – mohan111

+0

Eagle-Augen Mann überprüfen .. Haben Sie nicht sehen, dass '2017.01.23 21: 08: 22.280' in erwartetes Ergebnis –

+0

Sorry, ich werde die Frage @Prdp ab 2017 bearbeiten ist incremental of 2017 – mohan111

0

Sie nach:

declare @table table (id int, mon varchar(3), Dt datetime) 
INSERT INTO @Table (ID,Mon,Dt) SELECT 1, 'Jan','2016-12-23 21:08:22.280' 
INSERT INTO @Table (ID,Mon,Dt) SELECT 2, 'Feb','2016-2-23 21:08:22.280' 
INSERT INTO @Table (ID,Mon,Dt) SELECT 3, 'Mar','2016-3-23 21:08:22.280' 
INSERT INTO @Table (ID,Mon,Dt) SELECT 4, 'Apr','2016-4-23 21:08:22.280' 
INSERT INTO @Table (ID,Mon,Dt) SELECT 5, 'May','2016-5-23 21:08:22.280' 
INSERT INTO @Table (ID,Mon,Dt) SELECT 6, 'Jun','2016-6-23 21:08:22.280' 
INSERT INTO @Table (ID,Mon,Dt) SELECT 7, 'Jul','2016-7-23 21:08:22.280' 
INSERT INTO @Table (ID,Mon,Dt) SELECT 8, 'Aug','2016-8-23 21:08:22.280' 
INSERT INTO @Table (ID,Mon,Dt) SELECT 9, 'Sep','2016-9-23 21:08:22.280' 
INSERT INTO @Table (ID,Mon,Dt) SELECT 10, 'Oct','2016-10-23 21:08:22.280' 
INSERT INTO @Table (ID,Mon,Dt) SELECT 11, 'Nov','2016-11-23 21:08:22.280' 
INSERT INTO @Table (ID,Mon,Dt) SELECT 12, 'Dec','2016-12-23 21:08:22.280' 
INSERT INTO @Table (ID,Mon,Dt) SELECT 1, 'Jan','2017-1-23 21:08:22.280' 
INSERT INTO @Table (ID,Mon,Dt) SELECT 2, 'Feb','2016-2-23 21:08:22.280' 
INSERT INTO @Table (ID,Mon,Dt) SELECT 3, 'Mar','2016-3-23 21:08:22.280' 
INSERT INTO @Table (ID,Mon,Dt) SELECT 4, 'Apr','2016-4-23 21:08:22.280' 
INSERT INTO @Table (ID,Mon,Dt) SELECT 5, 'May','2016-5-23 21:08:22.280' 
INSERT INTO @Table (ID,Mon,Dt) SELECT 6, 'Jun','2016-6-23 21:08:22.280' 
INSERT INTO @Table (ID,Mon,Dt) SELECT 7, 'Jul','2016-7-23 21:08:22.280' 
INSERT INTO @Table (ID,Mon,Dt) SELECT 8, 'Aug','2016-8-23 21:08:22.280' 
INSERT INTO @Table (ID,Mon,Dt) SELECT 9, 'Sep','2016-9-23 21:08:22.280' 
INSERT INTO @Table (ID,Mon,Dt) SELECT 10, 'Oct','2016-10-23 21:08:22.280' 
INSERT INTO @Table (ID,Mon,Dt) SELECT 11, 'Nov','2016-11-23 21:08:22.280' 
INSERT INTO @Table (ID,Mon,Dt) SELECT 12, 'Dec','2016-12-23 21:08:22.280' 
Select * from @table 
--<grin /> 

oder tatsächlich,

Select id, mon, 
    Dateadd(month, mon-1, '23Jan2016 21:08:22.280') 
from @table 
+2

Das ist herrlich – Jens

+0

@Jens das ist überhaupt nicht funktioniert – mohan111

+1

@ mohan111 hat nie gesagt, es tat, nur dass es herrlich war. Selbst die INSERT-Anweisungen sind falsch. – Jens

1

id Annahme ist einzigartig Verzögerung würde arbeite so:

select id, mon, 
     coalesce(dt, dateadd(month, 1, LAG(dt) over (order by id asc))) as dt 
from @table; 

da id ist in Ihrem Beispiel Verzögerung nicht eindeutig nicht funktionieren kann (was ich gar nicht bemerkt, als ich meine ursprüngliche Bemerkung gemacht) aber ich vermute, dass ID nicht eindeutig ist gerade ist lazyness warum das zb .

+0

obwohl ID einzigartig machen es funktioniert nicht @Hogan – mohan111

+0

@ mohan111 - Entschuldigung siehe bearbeiten. – Hogan

+0

danke ... @ Hogan – mohan111