具有月份值的未透明列

时间:2016-12-22 16:11:33

标签: sql-server sql-server-2008

我正在开发一个数据库,其中包含一个包含月度项目值的表,如下所示:

UserName | ProjectName | Jan | Feb | Mar | Apr | May | Year

John     | Project1    | 1.1 | 2.1 | 1.2 | 0.8 |  1  | 2016
Alan     | Project2    | 1.6 | 3.1 | 0.2 | 5.8 | 1.2 | 2017

我想取消值,因此月份不再是列,而是一个组合月份和年份的列,以便在报告中更轻松地使用它们。理想的输出是:

UserName | ProjectName | Date   | MonthValue |

John     | Project1    | 1/16   |    1.1     |
John     | Project1    | 2/16   |    2.1     |
John     | Project1    | 3/16   |    1.2     |
John     | Project1    | 4/16   |    0.8     |
John     | Project1    | 5/16   |     1      |
Alan     | Project2    | 1/17   |    1.6     |
Alan     | Project2    | 2/17   |    3.1     |

我正在使用SQL Server 2008,所以我应该可以使用UNPIVOT或CROSS APPLY,但我似乎无法让它工作。这可能吗?

提前致谢。

1 个答案:

答案 0 :(得分:1)

以下是使用Cross Apply

的一种方法
;with Yourtable as
(
SELECT *
FROM   ( VALUES ('John','Project1',1.1,2.1,1.2,0.8,1,2016),
                ('Alan','Project2',1.6,3.1,0.2,5.8,1.2,2017) ) tc 
                ( [UserName], [ProjectName], [Jan], [Feb], [Mar], [Apr], [May], [Year]) 
)
SELECT UserName,
       ProjectName,
       [Date],
       MonthValue
FROM   Yourtable
       CROSS apply (VALUES (jan, '1/' + RIGHT(year, 2)),
                           (feb, '2/' + RIGHT(year, 2)),
                           (mar, '3/' + RIGHT(year, 2)),
                           (apr, '4/' + RIGHT(year, 2)),
                           (may, '5/' + RIGHT(year, 2))) cs (MonthValue, [Date]) 

结果:

╔══════════╦═════════════╦══════╦════════════╗
║ UserName ║ ProjectName ║ Date ║ MonthValue ║
╠══════════╬═════════════╬══════╬════════════╣
║ John     ║ Project1    ║ 1/16 ║ 1.1        ║
║ John     ║ Project1    ║ 2/16 ║ 2.1        ║
║ John     ║ Project1    ║ 3/16 ║ 1.2        ║
║ John     ║ Project1    ║ 4/16 ║ 0.8        ║
║ John     ║ Project1    ║ 5/16 ║ 1.0        ║
║ Alan     ║ Project2    ║ 1/17 ║ 1.6        ║
║ Alan     ║ Project2    ║ 2/17 ║ 3.1        ║
║ Alan     ║ Project2    ║ 3/17 ║ 0.2        ║
║ Alan     ║ Project2    ║ 4/17 ║ 5.8        ║
║ Alan     ║ Project2    ║ 5/17 ║ 1.2        ║
╚══════════╩═════════════╩══════╩════════════╝

由于MonthValue值导致Numeric列,Integer值将隐式转换为Numeric。由于Numeric更高优先级高于Int