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 Microsoft T/SQL,存储过程_Sql Server_Tsql_Stored Procedures - Fatal编程技术网

Sql server Microsoft T/SQL,存储过程

Sql server Microsoft T/SQL,存储过程,sql-server,tsql,stored-procedures,Sql Server,Tsql,Stored Procedures,根据年份和月份进行排序。我有一个专栏 其日期为2016年1月至2018年4月 我想排序的基础上,最近一年,然后一个月也需要排序 结果应该如下所示: 2018年1月 2018年2月 2018年3月 2018年4月 2017年1月 2017年2月至2017年12月 2016年1月-2016年 2016年2月 2016年3月至2016年12月 我做了类似的事情,但它有一个问题: Cast(Year(cast(Q.Column Name as small date time)) as char(4)

根据年份和月份进行排序。我有一个专栏

其日期为2016年1月至2018年4月

我想排序的基础上,最近一年,然后一个月也需要排序

结果应该如下所示:

  • 2018年1月
  • 2018年2月
  • 2018年3月
  • 2018年4月
  • 2017年1月
  • 2017年2月至2017年12月
  • 2016年1月-2016年
  • 2016年2月
  • 2016年3月至2016年12月
我做了类似的事情,但它有一个问题:

Cast(Year(cast(Q.Column Name as small date time)) as char(4)) + '-' + CASE WHEN Month(cast (Q.Column Name as small date time)) < 10 THEN '0' ELSE '' END  + cast(Month(cast (Q.Column Name as small date time)) as char(2)) 
Cast(年份(Cast(Q.Column Name作为小日期时间))作为字符(4))+'-'+CASE WHEN Month(Cast(Q.Column Name作为小日期时间))<10然后'0'否则''结束+Cast(Month(Cast(Q.Column Name作为小日期时间))作为字符(2))

提前感谢您

您可以使用apply
ORDER BY
,使用
CAST
DATEPART
分别按年份和月份进行订购:

declare @tmp table ([period] varchar(10))
insert into @tmp values 
('Jan-2016'), ('Feb-2016'), ('Mar-2016'), ('Apr-2016'), ('May-2016'), ('Jun-2016'), ('Jul-2016'), ('Aug-2016'), ('Sep-2016'), ('Oct-2016'), ('Nov-2016'), ('Dec-2016'), ('Jan-2017'), ('Feb-2017'), ('Mar-2017'), ('Apr-2017'), ('May-2017'), ('Jun-2017'), ('Jul-2017'), ('Aug-2017'), ('Sep-2017'), ('Oct-2017'), ('Nov-2017'), ('Dec-2017'), ('Jan-2018'), ('Feb-2018'), ('Mar-2018'), ('Apr-2018')

select  *
from @tmp 
order by DATEPART(year, cast( '1-' +  [period] as date)) desc, 
         DATEPART(month,cast( '1-' +  [period] as date)) asc
左侧为原始顺序,右侧为排序依据后的结果:

就你而言:

select  *
from YOUR_TABLE_NAME 
order by DATEPART(year, cast( '1-' +  [period] as date)) desc, 
         DATEPART(month,cast( '1-' +  [period] as date)) asc

这没有任何意义。为什么有些月份是随机分组的?这是一个很好的起点。格式正确!!!没有人会在没有格式的情况下阅读一行代码。@Andrea.谢谢你的回复,但我认为它必须是动态的。我有一个带有句号列的表。它应该来自这个表。然后你应该发布样本数据,@John。有关详细信息,请参见@johnyes,我知道它必须是动态的:为了给出完整的解决方案,我声明了一个带有静态值的表变量,以表明它是有效的。要使其动态化,只需删除脚本的前三行,并将
@tmp
替换为您的table@Andrea,我使用的是视图,不能使用ORDERBY子句。这就是我正在尝试的。转换(年(转换(期间为smalldatetime))为字符(4))+“-”+当月份(转换(期间为smalldatetime))小于10时,则“0”否则“”结束+转换(月份(转换(期间为smalldatetime))为字符(2))MonthSort@John请在您的问题中添加所有必需的详细信息,否则将无法帮助您。您应该添加您正在使用的视图、视图的TSQL代码、表/视图中的示例数据以及所需的输出