Sql server Microsoft T/SQL,存储过程
根据年份和月份进行排序。我有一个专栏 其日期为2016年1月至2018年4月 我想排序的基础上,最近一年,然后一个月也需要排序 结果应该如下所示: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)
- 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代码、表/视图中的示例数据以及所需的输出