我正在开发一个数据库,其中包含一个包含月度项目值的表,如下所示:
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,但我似乎无法让它工作。这可能吗?
提前致谢。
答案 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