对不起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
一样对待任何帮助都受到高度赞赏,因为我现在有一个主要的脑力......;)
答案 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 强>