按月排序,以及月份年份为字符串SQL的年份

时间:2014-11-12 20:29:27

标签: sql-server sql-order-by ssms

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项必须出现在选择列表中。

1 个答案:

答案 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,'')