database.sarang.net
UserID
Passwd
Database
DBMS
MySQL
PostgreSQL
Firebird
Oracle
Informix
Sybase
ㆍMS-SQL
DB2
Cache
CUBRID
LDAP
ALTIBASE
Tibero
DB 문서들
스터디
Community
공지사항
자유게시판
구인|구직
DSN 갤러리
도움주신분들
Admin
운영게시판
최근게시물
MS-SQL Q&A 6380 게시물 읽기
No. 6380
날짜구간을 열로 구현하고 싶습니다.
작성자
장성욱(yulla)
작성일
2012-06-05 23:26ⓒ
2012-06-05 23:58ⓜ
조회수
6,968

도저희 방법이 떠오르질 않습니다.

고수님들 답변좀 꼭 부탁드립니다.

 

아래와 같은 데이타를

 

start end val1 val1
2012-04-02 2012-04-10 dog S
2012-04-08 2012-04-12 pig P

 

아래와 같은 방법으로 만드는 방법좀 알려주십시요.

 

  n1 n2 n3 n4
2012-04-02 dog S    
2012-04-03 dog S    
2012-04-04 dog S    
2012-04-05 dog S    
2012-04-06 dog S    
2012-04-07 dog S    
2012-04-08 dog S    
2012-04-09 dog S    
2012-04-10 dog S pig P
2012-04-11     pig P
2012-04-12     pig P

프로시져를 해서라도 구현을 하고싶습니다. 음, 한달 기간은 처음에 주어질수 있습니다. (2012-04-01~2012-04-29)

 

좋은 해법 꼭좀 부탁드립니다.

이 글에 대한 댓글이 총 5건 있습니다.

 DECLARE @bgnDate DATE = '2012-04-01'

;
DECLARE @endDate DATE = '2012-04-29'
;
CREATE TABLE #dates (
aDate DATE
)
;
DECLARE @insDate DATE = @bgnDate
;
WHILE ( @insDate <= @endDate )
BEGIN
INSERT #dates( aDate ) VALUES( @insDate );
SET @insDate = DATEADD( DAY, 1, @insDate );
END
;
WITH givenTbl ( start, finish, val1, val2 )
AS
(
SELECT '2012-04-02', '2012-04-10', 'dog', 'S'
UNION ALL SELECT '2012-04-08', '2012-04-12', 'pig', 'P'
)
, wRn ( rn, start, finish, val1, val2 )
AS
(
SELECT ROW_NUMBER() OVER ( ORDER BY start ) AS rn, start, finish, val1, val2
FROM givenTbl
)
, adjustRange( rn, start, finish, val1, val2 )
AS
(
SELECT rn, start, finish, val1, val2
FROM wRn
WHERE rn = 1
UNION ALL
SELECT r2.rn, CASE WHEN r1.finish > r2.start THEN r1.finish ELSE r2.start END , r2.finish, r2.val1, r2.val2
FROM wRn AS r1
INNER JOIN wRn AS r2 ON r1.rn + 1 = r2.rn
)
SELECT aDate, MAX( n1 ) AS n1, MAX( n2 ) AS n2, MAX( n3 ) AS n3, MAX( n4 ) AS n4
FROM (
SELECT aDate
, CASE rn WHEN 1 THEN val1 ELSE NULL END AS n1
, CASE rn WHEN 1 THEN val2 ELSE NULL END AS n2
, CASE rn WHEN 2 THEN val1 ELSE NULL END AS n3
, CASE rn WHEN 2 THEN val2 ELSE NULL END AS n4
FROM adjustRange AS gt
INNER JOIN #dates AS dt ON gt.start <= dt.aDate AND dt.aDate <= gt.finish 
) AS dd
GROUP BY aDate
;
DROP TABLE #dates
;
우욱님이 2012-06-06 17:38에 작성한 댓글입니다. Edit

 오~~옷~~감사합니다. 일단 이거 참고로 만들어 보겠습니다.

엄청난 도움 될거 같아요. 감사해요.

장성욱님이 2012-06-07 08:02에 작성한 댓글입니다. Edit

음 고수님 근대

 

  start end val1 val1
  2012-04-02 2012-04-10 dog S
  2012-04-08 2012-04-12 pig P
  2012-04-09 2012-04-16 cat P

위와 같이 추가 되는 경우 4월 9,10일은 더 겹쳐져야 합니다.

 

  n1 n2 n3 n4
2012-04-02 dog S    
2012-04-03 dog S    
2012-04-04 dog S    
2012-04-05 dog S    
2012-04-06 dog S    
2012-04-07 dog S    
2012-04-08 dog S pig P
2012-04-09 dog S pig P
2012-04-09 cat S pig P
2012-04-10 dog S pig P
2012-04-10 cat S pig P
2012-04-11 cat S pig P
2012-04-12 cat S pig P
2012-04-13 cat S pig P
2012-04-14 cat S pig P
2012-04-15 cat S pig P
2012-04-16 cat S pig P

즉 중간에 한열이 더 추가되어져야 할거 같은대...ㅠㅠ(아 참고로 adjustRange 부분은 필요가 없을거같아요)

제가 결과테이블을 처음에 잘못넣어서...

음...말하자면 날짜가 겹쳐지는 부분을 어떻게 해결해야 하나요? 컬럼을 더 추가할순 없습니다.

ㅠㅠ

꼭꼭 답변 부탁드립니다. 순서에 상관없이 꼭 결과만 나와도 됩니다.

장성욱(yulla)님이 2012-06-07 22:37에 작성한 댓글입니다.
이 댓글은 2012-06-07 23:02에 마지막으로 수정되었습니다.

 모르겠습니다.

cat 옆에는 P가 있었는데 왜 S가 옆에 붙었는지... 더불어 왜 pig는 P를 계속 옆에 달고 있는지... 그리고 dog의 S가 P로 바뀔 수 없는지...

 

또 있습니다. cat은 dog과 같은 줄에 섰는데 pig는 왜 다른 줄에 섰는지...

 

만약

2012-04-08 2012-04-10 cow S

이런 데이터가 추가로 들어가면 어떻게 되어야 하는지..

 

 

이럴때 느끼는 기분은 '저 산이야 저길 올라가야돼~~'

'올라와서 보니까 이 산이 아닌가봐....'

우욱님이 2012-06-08 15:42에 작성한 댓글입니다. Edit

 일단 어찌어찌 구현했습니다. 답변 감사합니다.

장성욱님이 2012-06-08 17:52에 작성한 댓글입니다. Edit
[Top]
No.
제목
작성자
작성일
조회
6383쿼리 질문입니다. [1]
정재훈
2012-06-08
6589
6382mssql 2000 에서 top [6]
노진광
2012-06-08
7158
6381MSSQL 2000 or MSSQL 2005 접속계정 패스워드 관리되는 파일, 레지 등등의 공간 [1]
최영호
2012-06-07
7670
6380날짜구간을 열로 구현하고 싶습니다. [5]
장성욱
2012-06-05
6968
6379sql_server가 갑자기 연결이 안되요?
김성호
2012-06-04
6363
6378쿼리 작성 좀 도와주세요 [2]
전기영
2012-05-31
6435
6377쿼리 문의 드려요 [1]
김종섭
2012-05-28
6319
Valid XHTML 1.0!
All about the DATABASE... Copyleft 1999-2024 DSN, All rights reserved.
작업시간: 0.025초, 이곳 서비스는
	PostgreSQL v16.2로 자료를 관리합니다