2017-09-14 3 views
-2

I have my table valus like in imageIch mag SQL

I startdate Wert durch DaysCount Spalte Bitten mir jemand helfen, in dem Schreiben von SQL Server-Abfrage wiederholen will alle Daten im dynamischen Bereich wählen, so dass ich die Anforderung erfüllen kann.

Vielen Dank im Voraus.

+0

unzureichende Informationen zur Verfügung gestellt wurde. Außerdem haben Sie keine spezifische Frage gestellt. – JohnH

Antwort

0

Sie nicht genügend Informationen für eine bestimmte Antwort zur Verfügung gestellt haben, aber wenn alle wollen, sind Sie zu tun ist, alle Termine in der Datumsspalte zu erhalten:

SELECT StartDates AS Dates 
FROM table_name 
+0

möchte ich startdate zu DaysCount Spaltenwert iterieren – Nadeem

1

Ihre Frage viel Klarheit fehlt aber ich verstehe wirklich, was du hier willst. Der beste Weg, dies zu erreichen, ist mit einem Tally-Tisch. Ich halte einen als Blick in meinem System.

create View [dbo].[cteTally] as 

WITH 
    E1(N) AS (select 1 from (values (1),(1),(1),(1),(1),(1),(1),(1),(1),(1))dt(n)), 
    E2(N) AS (SELECT 1 FROM E1 a, E1 b), --10E+2 or 100 rows 
    E4(N) AS (SELECT 1 FROM E2 a, E2 b), --10E+4 or 10,000 rows max 
    cteTally(N) AS 
    (
     SELECT ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) FROM E4 
    ) 
select N from cteTally 

Jetzt brauchen wir eine Tabelle, um mit unseren Daten zu beginnen. Dies sollten Sie in Zukunft veröffentlichen. Dann können wir einfach die Kraft unseres Tally-Tisches nutzen und voila, das Problem ist einfach.

declare @SomeTable table 
(
    StartDate date 
    , DaysCount int 
) 

insert @SomeTable 
select '2017-06-23', 1 union all 
select '2017-06-26', 3 union all 
select '2017-08-07', 1 

select MyDate = dateadd(day, t.N - 1, st.StartDate) 
from @SomeTable st 
join cteTally t on t.N <= st.DaysCount 
order by st.StartDate 
    , t.N 

erhalten Sie folgende Ausgabe:

2017-06-23 
2017-06-26 
2017-06-27 
2017-06-28 
2017-08-07 

--EDIT-- Ich würde mit einem tally Tabelle empfehlen, wie ich geschrieben, wie es in so vielen Situationen unglaublich nützlich ist. Aber manchmal funktioniert das nicht. Kein Problem. Hier ist eine Möglichkeit, wie Sie das inline machen können. Beachten Sie, dass ich die Tally-Tabelle hier auch etwas kürzer gemacht habe, da Sie scheinbar nicht so viele Werte benötigen.

WITH 
    E1(N) AS (select 1 from (values (1),(1),(1),(1),(1),(1),(1),(1),(1),(1))dt(n)), 
    E2(N) AS (SELECT 1 FROM E1 a, E1 b), --10E+2 or 100 rows 
    cteTally(N) AS 
    (
     SELECT ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) FROM E2 
    ) 

select MyDate = dateadd(day, t.N - 1, st.StartDate) 
from @SomeTable st 
join cteTally t on t.N <= st.DaysCount 
order by st.StartDate 
    , t.N 
+0

Ich will keine Sicht oder Tabelle erstellen ich es on the fly – Nadeem

+0

Große Antwort Sean müssen, wie immer. +1 – scsimon

+0

@NadeemZee Sie müssen die Ansicht nicht erstellen. Sie können einfach das CTE verwenden. – scsimon

0

zuerst einen Termin Tabelle erstellen, die Sie beitreten können, und dann mit etwas auf den Tisch kommen, wie:

[Date] BETWEEN [StartDate] AND DATEADD(day, [DaysCount], [StartDate]) 
1

Hier ist eine andere Art und Weise mit einer rekursiven CTE, obwohl Sean Lange Antwort ist definitiv die bevorzugte Methode.

HERE IS A DEMO

declare @table table (StartDate date, DaysCount int) 
insert into @table 
values 
('20170623',1), 
('20170626',3), 
('20170807',1) 


declare @max date = (select max(StartDate) from @table) 

;with cte as(
    select min(StartDate) as StartDate 
    from @table 
    union all 
    select dateadd(day,1,StartDate) 
    from cte 
    where StartDate < @max 
) 


select 
    c.StartDate 
from 
cte c 
inner join 
@table t on 
    c.StartDate < dateadd(day,t.DaysCount,t.StartDate) 
    and c.StartDate >= t.StartDate 
option (maxrecursion 0) 
+0

nicht funktioniert die Abfrage Prüfung dieses ('20170623', 1), ('20170626', 3), ('20170807', 1), ('20170926', 4) – Nadeem

+0

Ihr Kommentar macht keinen Sinn, aber Ich habe ein reproduzierbares Beispiel für den Link HIER IST EINE DEMO in meiner Antwort gegeben. Ich kann nicht sehen, was du an deinem Ende machst, um ein Problem zu verursachen. http://rextester.com/IOZPTC82923 – scsimon

0

Sie erwägen, gut mit Cursorn in SQL

---Creating records 
with cte as(Select Cast('01-01-2000' as Date) as startDate,1 as countD 
union all 
Select Cast('02-01-2000' as Date) as startDate,3 as countD 
union all 
Select Cast('10-01-2000' as Date) as startDate,1 as countD) 
Select * into #Temp from cte; 

--Creating temp table to hold results 
create table #Result(
startDate Date, 
) 

--Using cursor to insert records 
DECLARE @startDate Date, 
@count int; 


DECLARE db_cursor CURSOR FOR 
SELECT startDate , countD 
FROM #Temp 

OPEN db_cursor 
FETCH NEXT FROM db_cursor INTO @startDate , @count 

WHILE @@FETCH_STATUS = 0 
BEGIN 
    WHILE @count> 0 
     BEGIN 
     set @count = @count-1; 
     set @startDate = DATEADD(DAY, @count, cast (@startDate as date)); 
     INSERT INTO #Result 
     Select @startDate; 

     END 

    FETCH NEXT FROM db_cursor INTO @startDate , @count 
END 

CLOSE db_cursor 
DEALLOCATE db_cursor 

Select * from #Result