2014-07-08 5 views
0

헤더에 대해 유감스럽게 생각합니다. 내가 원하는 것을 설명하는 올바른 방법을 찾을 수 없습니다. 이유는 무엇입니까? 문제 :다른 필드의 값에 따라 날짜를 설정하십시오.

나는 다음과 같은 구조와 몇 가지 예를 들어 데이터 테이블을 가지고 :

CREATE TABLE [dbo].[set_dates](
[Split3_ID] [int] IDENTITY(1,1) NOT NULL, 
[CU_ID] [int] NULL, 
[order_id] [int] NULL, 
[st_date] [datetime] NULL, 
[sku] [int] NULL, 
[Priority] [int] NULL, 
[Delay] [int] NULL, 
[CourseDate] [datetime] NULL 
) ON [PRIMARY] 
GO 

INSERT INTO [dbo].[set_dates] 
     ([CU_ID] 
     ,[order_id] 
     ,[st_date] 
     ,[sku] 
     ,[Priority] 
     ,[Delay]) 
VALUES 
     (25721,7907,GETDATE(),63,4,4), 
     (25718,7910,GETDATE(),63,4,4), 
     (25718,7910,GETDATE(),6,5,2), 
     (25719,7908,GETDATE(),6,5,2), 
     (25719,7908,GETDATE(),57,4,4), 
     (25719,7908,GETDATE(),52,8,2) 
    GO 

그래서 내 표는 다음과 같아야합니다

Split3_ID CU_ID order_id st_date     sku Priority Delay CourseDate 

1   25721 7907  2014-07-08 18:04:30.973 63 4  4  NULL 
2   25718 7910  2014-07-08 18:04:30.973 63 4  4  NULL 
3   25718 7910  2014-07-08 18:04:30.973 6 5  2  NULL 
4   25719 7908  2014-07-08 18:04:30.973 6 5  2  NULL 
5   25719 7908  2014-07-08 18:04:30.973 57 4  4  NULL 
6   25719 7908  2014-07-08 18:04:30.973 52 8  2  NULL 

것은 지금 달성하고 싶은 무엇 Cour을 설정하는 것입니다. order_id, priority 및 delay ... 세 개의 필드에 따라 seDate ... more :

동일한 order_id를 가진 행이 하나있는 경우 CourseDate = st_date, 동일한 order_id를 가진 여러 행이있는 경우 날짜 우선 순위에 따라 입력해야합니다.

Split3_ID CU_ID order_id st_date     sku Priority Delay CourseDate 

1   25721 7907  2014-07-08 18:04:30.973 63 4  4  2014-07-08 

2   25718 7910  2014-07-08 18:04:30.973 63 4  4  2014-07-08 
3   25718 7910  2014-07-08 18:04:30.973 6 5  2  2014-07-12 

4   25719 7908  2014-07-08 18:04:30.973 6 5  2  2014-07-12 
5   25719 7908  2014-07-08 18:04:30.973 57 4  4  2014-07-08 
6   25719 7908  2014-07-08 18:04:30.973 52 8  2  2014-07-14 
: 최저 우선 순위는 첫째 CourseDate = st_date, 다음에 더 우선 순위가 이전 항목에서 지연 + st_date 것 ... 등등 ... 위의 예에서

, 결과는 다음과 같이해야 될 것이다

이것을 수행 할 수있는 방법이 있습니까? 사전 정렬없이 동일한 order_id로 최대 10 개의 주문을 받았으므로 CASE 문을 사용한 첫 번째 시도는 많은 글을 작성했습니다.

두 번째 중요한 문제는 동일한 order_id에서 때때로 같은 우선 순위의 주문이있을 수 있다는 것입니다.)

+0

안녕 나는 행이 3 열 그룹에서 ORDER_ID에 따라 그룹화 볼 수는 I 중간 로우는 가장 낮은 우선 순위를 가지며, 따라서 st_date 등이있다 볼 수 7,908을 ORDER_ID 코스 날짜. 위의 행 (Split3_ID = 4)은 우선 순위가 낮은 행이 4의 지연을 갖는다는 사실로부터 2014-07-12의 코스 날짜를 받습니까? Split3_ID = 6은 Split3_ID 4와 5의 결합 된 지연으로 2014-07-14의 CourseDate를 얻고 있습니까? – russ

+0

그래, 그게 어떻게 작동하는지 ... 해결책은 이미 많이 발견되었지만 (매우 간단한 업데이트 문은 아래를 참조하십시오.) – user2301990

답변

0

여기 내 솔루션이입니다, 나는 순간 ...에서 주요 brainfart있어이 경우 나는 그 단지 CourseDate = st_date

어떤 도움을 매우 높이 평가처럼 취급하고 싶습니다. 방금 해답을 얻었다는 의견을 보았습니다. 답변으로 게시 할 수도 있습니다.

WITH c1 AS (
    SELECT *, rn = ROW_NUMBER() OVER (PARTITION BY order_id ORDER BY priority) 
    FROM set_dates 
) 
, c2 AS ( 
    SELECT 
    *, 
    first_date = (SELECT b.st_date FROM c1 b WHERE a.order_id = b.order_id AND b.rn = 1), 
    delay_day = (SELECT SUM(delay) FROM c1 b WHERE a.order_id = b.order_id AND a.rn > b.rn) 
    FROM c1 a 
) 
SELECT 
    split3_id,cu_id,order_id,st_date,sku,priority,delay 
    ,coursedate = DATEADD(dd,ISNULL(delay_day,0),first_date) 
FROM c2 

SQL Fiddle Demo

+0

완벽, CONVERT (varchar, DATEADD (dd, ISNULL (delay_day, 0) , first_date), 23) !! – russ

관련 문제