将格式化的日期列排序为日期

时间:2017-10-12 06:36:44

标签: sql sql-server

我正在将日期列格式化为仅包含年份和月份名称的字符串,如下所示

             WITH c1 as ( 
 SELECT  FORMAT(CompletedDate,'MMMM yyyy') as FormattedDate, 
 COUNT(CASE WHEN CoId =5 then 1 ELSE NULL END) as "SSS",
 COUNT(CASE WHEN CoId =3 then 1 ELSE NULL END) as "EEE"
  FROM Rtml5
  where CompletedDate>='2017-01-01' AND CompletedDate<= '2017-12-31'
 group by  FORMAT(CompletedDate,'MMMM yyyy')
 ), 
 c2 As (
   SELECT FORMAT(CompletedDate,'MMMM yyyy')  as FormattedDate,COUNT(Rawew_ID) as MMM
  FROM Rawew
  where CompletedDate>='2017-01-01' AND CompletedDate<= '2017-12-31'
 group by  FORMAT(CompletedDate,'MMMM yyyy')
 )
 SELECT coalesce(c1.FormattedDate, c2.FormattedDate) as FormattedDate, c1.SSS,c1.EEE,c2.MMM
FROM c1 FULL OUTER JOIN c2 on c1.FormattedDate = c2.FormattedDate

然后我在FORMAT(CompletedDate,'MMMM yyyy')上使用了这个格式化列的组 我得到的结果如下

    April 2017
    August 2017
    February 2016
    January 2017
    July 2016
    June 2017
    March 2017
    May 2017
    October 2017
    September 2017

但是我如何将其作为Date列本身进行排序。我希望结果按照顺序2016年2月,7月206,Januaty2017,2017年2月....

1 个答案:

答案 0 :(得分:1)

按年份和月份排序,他们需要在分组和cte结果中。

WITH c1 as ( 
    SELECT  FORMAT(CompletedDate,'MMMM yyyy') as FormattedDate,
      datepart(year,CompletedDate) YearNr,datepart(month,CompletedDate) MonthNr
      COUNT(CASE WHEN CoId =5 then 1 ELSE NULL END) as "SSS",
      COUNT(CASE WHEN CoId =3 then 1 ELSE NULL END) as "EEE"
    FROM Rtml5
    where CompletedDate>='2017-01-01' AND CompletedDate<= '2017-12-31'
    group by  datepart(year,CompletedDate),datepart(month,CompletedDate),
      FORMAT(CompletedDate,'MMMM yyyy')
     ), 
c2 As (
    SELECT FORMAT(CompletedDate,'MMMM yyyy')  as FormattedDate,COUNT(Rawew_ID) as MMM, 
      datepart(year,CompletedDate) YearNr,datepart(month,CompletedDate) MonthNr
    FROM Rawew
    where CompletedDate>='2017-01-01' AND CompletedDate<= '2017-12-31'
    group by  datepart(year,CompletedDate),datepart(month,CompletedDate),
      FORMAT(CompletedDate,'MMMM yyyy')
 )

SELECT coalesce(c1.FormattedDate, c2.FormattedDate) as FormattedDate, c1.SSS,c1.EEE,c2.MMM
FROM c1 
FULL OUTER JOIN c2 on c1.FormattedDate = c2.FormattedDate
order by coalesce(c1.YearNr,c2.YearNr),coalesce(c1.MonthNr,c2.MonthNr)