根据其他字段的值设置日期

时间:2014-07-08 11:28:39

标签: sql-server

对不起Header,我找不到正确的方式来描述我想要的东西,可能是我无法通过Google搜索获得解决方案:) ...这里我的问题:

我有一个包含以下结构和一些示例数据的表:

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

我现在想要完成的是根据三个字段设置CourseDate,order_id,Priority和Delay ......更确切地说:

如果只有一行具有相同的order_id,则CourseDate = st_date,如果有多个行具有相同的order_id,则应根据优先级输入日期。最低优先级将是第一个CourseDate = st_date,下一个更大的优先级将是st_date +来自前一个条目的延迟......依此类推......

在上面的例子中,结果应如下所示:

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

有没有办法实现这个目标?我已经获得了相同order_id的十个订单而没有预先分配,所以我对CASE语句的第一次尝试最终写了很多。

第二个但不是那么重要的问题是,在同一个order_id下可能会不时有相同优先级的订单。在这种情况下,我希望那些像CourseDate = st_date

一样对待

任何帮助都受到高度赞赏,因为我现在有一个主要的脑力......;)

1 个答案:

答案 0 :(得分:0)

这是我的解决方案。我刚刚看到你的意见,你已经有了解决方案。您也可以将其作为答案发布。

 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