如何在没有循环的情况下生成要包含在UNPIVOT结果中的日期?

时间:2015-08-07 15:04:34

标签: tsql

假设我有一个这样的例子,我用UNPIVOT将列转换为行。

DECLARE  @pvt AS TABLE  (VendorID int, Emp1 int, Emp2 int, Emp3 int, Emp4 int, Emp5 int);

INSERT INTO @pvt (VendorId,Emp1,Emp2,Emp3,Emp4,Emp5) VALUES (1,4,3,5,4,4);
INSERT INTO @pvt (VendorId,Emp1,Emp2,Emp3,Emp4,Emp5) VALUES (2,4,1,5,5,5);
INSERT INTO @pvt (VendorId,Emp1,Emp2,Emp3,Emp4,Emp5) VALUES (3,4,3,5,4,4);
INSERT INTO @pvt (VendorId,Emp1,Emp2,Emp3,Emp4,Emp5) VALUES (4,4,2,5,5,4);
INSERT INTO @pvt (VendorId,Emp1,Emp2,Emp3,Emp4,Emp5) VALUES (5,5,1,5,5,5);

--Unpivot the table.
SELECT VendorID, Employee, Orders
FROM 
   (SELECT VendorID, Emp1, Emp2, Emp3, Emp4, Emp5
   FROM @pvt) p
UNPIVOT
   (Orders FOR Employee IN 
      (Emp1, Emp2, Emp3, Emp4, Emp5)
)AS unpvt;
GO

产生这样的结果

   VendorID     Employee    Orders
    1           Emp1            4
    1           Emp2            3
    1           Emp3            5
    1           Emp4            4
    1           Emp5            4
    2           Emp1            4
    2           Emp2            1
    2           Emp3            5
    2           Emp4            5
    2           Emp5            5
    3           Emp1            4
    3           Emp2            3
    3           Emp3            5
    3           Emp4            4
    3           Emp5            4

但是,我希望包含一个“增量日期,以便它在每个供应商的组中重复,结果将是这样的

VendorID    Employee    Orders      OrderDate
1           Emp1            4       01/01/2014
1           Emp2            3       02/01/2014
1           Emp3            5       03/01/2014
1           Emp4            4       04/01/2014
1           Emp5            4       05/01/2014
2           Emp1            4       ..
2           Emp2            1
2           Emp3            5
2           Emp4            5
2           Emp5            5
3           Emp1            4
3           Emp2            3
3           Emp3            5
3           Emp4            4
3           Emp5            4

踢球者是我想尝试这样做而不采用循环,因为转换结果将是大约100K记录。有没有办法在没有循环结果的情况下生成那样的日期字段?

[编辑] 我认为,但不确定, [this] 1帖子可能有所帮助,使用ROW NUMBER

1 个答案:

答案 0 :(得分:0)

您可以使用:

Dateadd(DAY, row_number() over( partition by VendorId Order by Employee), @stardate)

根据您的示例,您可以按vendorId进行分区,并按Employee进行排序。但你可以像普通订单一样改变。