2017-01-04 1 views
0

에 날짜를 만듭니다나는 다음과 같은 한 SQL 서버

select distinct 
    loannumber, activedt, inactivedt 
from 
    smd..TABLE_NAME 
where 
    loannumber = '12345678' 

내가 activedtinactivedt 사이 매달/날짜 값을 포함하는 열을 만들 수 있어야합니다. 날짜가 변수로 설정되는 아이디어를 보았습니다. 그러나이 경우 날짜는 각 레코드의 테이블에서옵니다. 도와주세요. 감사.

+2

예제 데이터 및 원하는 결과는 가정을 줄입니다. –

+1

열에는 여러 값이 들어 있으면 안됩니다. 내가 정말로 원하는 것은 activedt와 inactivedt 사이의 매일 매일의 행입니다. 달력 표가 도움이 될지 모르지만 단순히 그 시절을 원한다면 집계표가 더 나은 접근 방식이 될 것입니다. –

답변

0

이 기사에서는 날짜 테이블을 사용하는 것이 좋습니다. 광범위한 설명이 있습니다. 아이디어는 이런 종류의 시나리오에 사용할 수 있다는 것입니다. 이 표와

https://www.mssqltips.com/sqlservertip/4054/creating-a-date-dimension-or-calendar-table-in-sql-server/

, 당신은 테이블 사이의 조인 및 날짜 열을 사용 할 수 있습니다.

+0

감사합니다. 하지만 그 상황은 너무 복잡합니다. 오히려 InactiveDt가 NULL이면 쿼리를 현재 날짜 이후의 날짜 만들기를 중지하거나 InactiveDt에 값이있는 경우 각 행에 대해 InactiveDt를 지나서 쿼리를 만드는 방법을 배우게됩니다. – user2811136

1

이렇게하면 월 단위로 증가합니다. 당신이 날을하려는 경우에는, 단지 우리는 master..spt_values와 임시 집계 테이블을 만드는

을 적용 십자가에서 DD에 MM을 변경할 수 있지만, 적절한 크기의 표는

Declare @YourTable table (loannumber varchar(25),activedt date,inactivedt date) 
Insert Into @YourTable values 
('12345678','2016-01-01','2017-12-31') 

Select A.LoanNumber 
     ,B.Date 
From @YourTable A 
Cross Apply (
     Select Top (DateDiff(MM,A.activedt,A.inactivedt)+1) Date=DateAdd(MM,Row_Number() Over (Order By (Select null))-1,A.activedt) 
     From master..spt_values 
     ) B 

반환

을 할 것입니다
LoanNumber Date 
12345678 2016-01-01 
12345678 2016-02-01 
12345678 2016-03-01 
12345678 2016-04-01 
12345678 2016-05-01 
12345678 2016-06-01 
12345678 2016-07-01 
12345678 2016-08-01 
12345678 2016-09-01 
12345678 2016-10-01 
12345678 2016-11-01 
12345678 2016-12-01 
12345678 2017-01-01 
12345678 2017-02-01 
12345678 2017-03-01 
12345678 2017-04-01 
12345678 2017-05-01 
12345678 2017-06-01 
12345678 2017-07-01 
12345678 2017-08-01 
12345678 2017-09-01 
12345678 2017-10-01 
12345678 2017-11-01 
12345678 2017-12-01 
0

당신은 실제 날짜 테이블의 성능을 이길 수 있지만, 당신은 단지 활성 또는 비활성 날짜 사이에 약 2000 일 이상 적은을 가지고있는 경우 기본 쿼리가 임시 반대, 다음에 CROSS APPLY을 고려하지 않아도됩니다 spt_valu es 테이블.

것은 나는 확실하지 이었기 때문에 경우 항상 또는 (활성 비활성 <와 활성> 비활성, 그리고 다른 사람 = 일부의 경우)하기 전에,이 경우 중 하나에 대한 작업을해야 활성 및 비활성 날짜 경우 :

select distinct 
    loannumber, activedt, inactivedt, dtvalue 
from 
    smd..TABLE_NAME 
    CROSS APPLY (
     SELECT DATEADD(DD, N.number, activedt) FROM spt_values N 
      WHERE N.number BETWEEN 0 AND DATEDIFF(DD, activedt, inactivedt) AND activedt <= inactivedt 
     UNION ALL SELECT DATEADD(DD, N.number, inactivedt) FROM spt_values N 
      WHERE N.number BETWEEN 0 AND DATEDIFF(DD, inactivedt, activedt) AND activedt > inactivedt 
    ) N (dtvalue) 
where 
    loannumber = '12345678' 

이 1/3에서 1/5로 단일 레코드 대출 번호에 대한 아래의 결과를 생산 : 2000 이상 취득해야하는 경우

loannumber activedt inactivedt dtvalue 
---------- ---------- ---------- ---------- 
12345678 2017-01-03 2017-01-05 2017-01-03 
12345678 2017-01-03 2017-01-05 2017-01-04 
12345678 2017-01-03 2017-01-05 2017-01-05 

, 적절한 행을 생성하는 UNION ALL에 추가 기술을 신속가 된 카운트.

+0

안녕하세요. 이제 다음이 있습니다. g – user2811136

+0

MO 열에 현재 날짜 이후에 MO가 작성되지 않도록하려면 어떻게합니까? YT 테이블을 선언 (날짜 inactivedt 대출 VARCHAR (25), activedt 일) 에 삽입] YT가 선택 별개의 대출, tblONE A로부터 inactivedt activedt, IF OBJECT_ID (N'tempdb .. # RR ') is not null Drop 테이블 #RR 대출 선택, 활성화 됨, 비활성, B.B 위해 - (master..spt_values ​​ 에서 1, A.activedt) (null의 선택))에 의해 이상 선택 MO = DateAdd 함수 (MM, ROW_NUMBER() (주문) tableONE A로부터 MO 십자가는 을 적용 loan desc로 – user2811136

+0

마지막'WHERE' 절에 추가 할 수 있습니다. 예를 들어 답을 보면, 뭔가 빠진 것이 아니라면'AND dtvalue <= GETDATE()' –