使用两个现有列中的数据创建DATE(一周的第一天)列

时间:2017-06-14 07:48:04

标签: sql sql-server tsql date

我一直在尝试创建当前表的视图,其中我使用原始表的两列创建日期。但我无法让它发挥作用..

在表格中,我有第14-52,1-13列,它们代表了财政年度的周数。 在表格中,最后一列是FiscalYear,在这种情况下,所有数据都设置为2017。

我想在视图中创建一个DATE列(通过使用特定周的星期一),该列基于年份(列)和会计年度(列)的周数

例如,我们有专栏#34;第14周和第34天;和专栏" 2017"我想回来" 20170403" (4月3日,2017年4月第一个星期一)。

所以在图片中: 目前我有这个:

1

我想创建这个:

2

非常感谢任何帮助!

2 个答案:

答案 0 :(得分:1)

CREATE TABLE SampleTable (EmployeeNumber int, 
[1] int, [2] int, [3] int, [4] int, 
[5] int, [6] int, [7] int, [8] int, 
[9] int, [10] int, [11] int, [12] int, [13] int,
[14] int, [15] int, [16] int, [17] int, 
[18] int, [19] int, [20] int, [21] int, 
[22] int, [23] int, [24] int, [25] int, FiscalYear int);
GO
INSERT INTO SampleTable VALUES (1,
1,2,3,4,
5,6,7,8,
9,10,11,12,13,
1000,2000,3000,4000,5000,6000,7000,8000,9000,10000,11000,12000, 2017);
GO
SET DATEFIRST 1

SELECT EmployeeNumber
 ,CONVERT(VARCHAR(8)
 ,dateadd (week, CONVERT(int, [Date])
 ,dateadd (year, CASE WHEN CONVERT(int, [Date]) < 14 THEN FiscalYear + 1 ELSE FiscalYear END - 1900 , 0)) - 4 - datepart(dw, dateadd (week, CONVERT(int,[Date])
 ,dateadd (year, CASE WHEN CONVERT(int, [Date]) < 14 THEN FiscalYear + 1 ELSE FiscalYear END - 1900 , 0)) - 4) + 1, 112) AS [DATE]
,FiscalYear
,Budget
FROM 
(
    SELECT EmployeeNumber, [1], [2], [3], [4], [5], [6], [7], [8], [9], [10], [11], [12], [13], [14], [15], [16], [17], [18], [19], [20], [21], [22], [23], [24], [25], FiscalYear FROM SampleTable
) p
UNPIVOT
(
Budget FOR [Date] IN ([1], [2], [3], [4], [5], [6], [7], [8], [9], [10], [11], [12], [13], [14], [15], [16], [17], [18], [19], [20], [21], [22], [23], [24], [25])
)
AS unpvt

我希望它会对你有所帮助。

答案 1 :(得分:0)

使用unpivot和几个tircks:

我不明白为什么1000变成1.000所以自己管理:

select a.EmployeeNumber,
        DATEADD(DAY, DATEPART(WEEKDAY,(DATEADD(WEEK,a.weeks-1,(select cast('01/01/'+ CAST(a.FiscalYear as nvarchar(4)) as date))))) , 
        CAST((DATEADD(WEEK,a.weeks-1,(select cast('01/01/'+ CAST(a.FiscalYear as nvarchar(4)) as date)))) AS DATE)) [Date],a.FiscalYear,a.budget
         from emp e
unpivot
(
budget 
for weeks in ([14],[15],[16],[17],[18],[19],[20],[21],[22],[23],[24],[25])
) a

输出结果为:

*------------------*-------------*-----------*----------*
|EmployeeNumber   |Date         |FiscalYear  |  budget  |
*------------------*-------------*-----------*----------*
|1234             |2017-04-03   |2017        | 1000     |
*------------------*-------------*-----------*----------*
|1234             |2017-04-10   |2017        | 2000     |
*------------------*-------------*-----------*----------*
|1234             |2017-04-17   |2017        | 3000     |
*------------------*-------------*-----------*----------*
|1234             |2017-04-24   |2017        | 4000     |
*------------------*-------------*-----------*----------*
|1234             |2017-05-01   |2017        | 5000     |
*------------------*-------------*-----------*----------*
|1234             |2017-05-08   |2017        | 6000     |
*------------------*-------------*-----------*----------*
|1234             |2017-05-15   |2017        | 7000     |
*------------------*-------------*-----------*----------*
|1234             |2017-05-22   |2017        | 8000     |
*------------------*-------------*-----------*----------*
|1234             |2017-05-29   |2017        | 9000     |
*------------------*-------------*-----------*----------*
|1234             |2017-06-05   |2017        | 10000    |
*------------------*-------------*-----------*----------*
|1234             |2017-06-12   |2017        | 11000    |
*------------------*-------------*-----------*----------*
|1234             |2017-06-19   |2017        | 12000    |
*------------------*-------------*-----------*----------*