Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 按月排序,然后按年排序,当MonthYear是字符串SQL时_Sql Server_Sql Order By_Ssms - Fatal编程技术网

Sql server 按月排序,然后按年排序,当MonthYear是字符串SQL时

Sql server 按月排序,然后按年排序,当MonthYear是字符串SQL时,sql-server,sql-order-by,ssms,Sql Server,Sql Order By,Ssms,因为MonthYear是活动月和活动年的串联字符串-从行到列。我想按月份订购,但现在是字符串,按字符串值而不是int值订购。我怎样才能按子字符串(MonthYear,1,2),子字符串(MonthYear,2,4)将其分解为顺序 但我得到了一个错误: 味精207,16级,状态1,第23行 列名“MonthYear”无效 味精207,16级,状态1,第23行 列名“MonthYear”无效 Msg 145,第15级,状态1,第12行 如果指定了select DISTINCT,则ORDER BY项目

因为
MonthYear
是活动月和活动年的串联字符串-从行到列。我想按月份订购,但现在是字符串,按字符串值而不是int值订购。我怎样才能按子字符串(MonthYear,1,2),子字符串(MonthYear,2,4)将其分解为
顺序

但我得到了一个错误:

味精207,16级,状态1,第23行
列名“MonthYear”无效

味精207,16级,状态1,第23行
列名“MonthYear”无效

Msg 145,第15级,状态1,第12行
如果指定了select DISTINCT,则ORDER BY项目必须出现在选择列表中


尝试用以下内容替换@cols声明:

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)

你能去掉“独特的”吗?您不应该需要它,因为您将ActivityMonth和ActivityYear包含在GROUP BY中。如果我去掉distinct,则order BY子句也会出现相同的错误。如果我删除order by语句,没有distinct,我会得到错误:Msg 1056,级别15,状态1,第2行。select列表中的元素数超过了允许的最大4096个元素数。消息102,级别15,状态1,第8行“x”附近的语法不正确。好的,为什么要按类别和ID分组?选择列表中没有这两个选项。
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,'')