declare @ActivityYearStart int = 2014
declare @ActivityYear2 int = (@ActivityYearStart + 2)
declare @ActivityYearEnd int = 2015
declare @ActivityYearM1 int = (@ActivityYearEnd - 1)
declare @ActivityMonth int = 1
declare @ActivityMonth1 int = 3
DECLARE @cols AS NVARCHAR(MAX),
@query AS NVARCHAR(MAX)
select @cols = STUFF((SELECT distinct ',' + QUOTENAME((CONVERT(varchar(5), ActivityMonth) + '-'
+ CONVERT(varchar(5), ActivityYear))) As MonthYear
FROM Forecast
WHERE((ActivityYear = @ActivityYearStart)
AND (ActivityMonth between @ActivityMonth and 12))
OR ((ActivityYear between @ActivityYear2 and @ActivityYearM1)
AND (ActivityMonth between 1 and 12))
OR ((ActivityYear = @ActivityYearEnd)
AND (ActivityMonth between 1 and @ActivityMonth1))
AND Category = 'Forecast'
Group By Category, ID, ActivityMonth, ActivityYear
Order By SUBSTRING(MonthYear, 1, 2), SUBSTRING(MonthYear, 2, 4)
FOR XML PATH(''), TYPE
).value('.', 'NVARCHAR(MAX)')
,1,1,'')
set @query = '
SELECT Category, ID, ' + @cols + ' FROM
(
SELECT Category, ID, (CONVERT(varchar(5), ActivityMonth) + ''-''
+ CONVERT(varchar(5), ActivityYear)) As MonthYear, HoursCharged
FROM Forecast
) x
PIVOT
(
Sum(HoursCharged)
for MonthYear in (' + @cols + ')
) p '
execute(@query)
由于MonthYear
是活动月和活动年的串联字符串,因此从行到列。我想按月份订购,但现在它是一个字符串,按字符串值而不是int值排序。我怎样才能将其分解为Order By SUBSTRING(MonthYear, 1, 2), SUBSTRING(MonthYear, 2, 4)
。
但我收到错误:
Msg 207,Level 16,State 1,Line 23
列名称'MonthYear'无效。Msg 207,Level 16,State 1,Line 23
列名称'MonthYear'无效。Msg 145,Level 15,State 1,Line 12
如果指定了SELECT DISTINCT,则ORDER BY项必须出现在选择列表中。
答案 0 :(得分:1)
尝试用以下代码替换你的@cols声明:
select @cols = STUFF((SELECT ',' + QUOTENAME((CONVERT(varchar(5), ActivityMonth) + '-'
+ CONVERT(varchar(5), ActivityYear))) As MonthYear
FROM Forecast
WHERE((ActivityYear = @ActivityYearStart)
AND (ActivityMonth between @ActivityMonth and 12))
OR ((ActivityYear between @ActivityYear2 and @ActivityYearM1)
AND (ActivityMonth between 1 and 12))
OR ((ActivityYear = @ActivityYearEnd)
AND (ActivityMonth between 1 and @ActivityMonth1))
AND Category = 'Forecast'
Group By ActivityMonth, ActivityYear
Order By ActivityYear, ActivityMonth
FOR XML PATH(''), TYPE
).value('.', 'NVARCHAR(MAX)')
,1,1,'')