SQL日期格式和排序问题

时间:2016-03-22 20:37:23

标签: sql-server

我希望返回一年然后一周结束,然后按年份分组,然后按周结束。这段代码的问题在于除了排序之外它还可以执行所有操作。

 SELECT datepart(YEAR, CONVERT(DATE, PH.CreatedOn)) Year,  
    Convert(varchar(2), Datepart(month, DATEADD(D, -1 * DATEPART(dw, PH.createdon) + 7,  PH.createdon)), 101)  +  '/'  + Convert(varchar(2), Datepart(Day, DATEADD(D, -1 * DATEPART(dw, PH.createdon) + 7,  PH.createdon)), 101)  [Week Processed],
    COUNT(PH.new_purchasehistoryid) AS 'Registrations'
FROM new_purchasehistory PH
GROUP BY    DATEPART(YEAR, CONVERT(DATE, PH.createdon)), Convert(varchar(2), Datepart(month, DATEADD(D, -1 * DATEPART(dw, PH.createdon) + 7,  PH.createdon)), 101)  +  '/'  + Convert(varchar(2), Datepart(Day, DATEADD(D, -1 * DATEPART(dw, PH.createdon) + 7,  PH.createdon)), 101) 

ORDER BY DATEPART(YEAR, CONVERT(DATE, PH.createdon)) DESC, Convert(varchar(2), Datepart(month, DATEADD(D, -1 * DATEPART(dw, PH.createdon) + 7,  PH.createdon)), 101)  +  '/'  + Convert(varchar(2), Datepart(Day, DATEADD(D, -1 * DATEPART(dw, PH.createdon) + 7,  PH.createdon)), 101) desc

结果如下。我想我需要另一个数字。有更简单的方法吗?

Year    Week Processed  Registrations
2016    2/6     5935
2016    2/27    4288
2016    2/20    4205
2016    2/13    3177
2016    1/9 10422
2016    1/30    3834
2016    1/23    3411
2016    1/16    2718
2015    9/5     8560
2015    9/19    6245
2015    9/12    7427
2015    8/8     6489
2015    8/29    6558

1 个答案:

答案 0 :(得分:0)

您可以通过子选择让生活更轻松。如果你订购的colums需要在选择中,那么你需要另一个子选择。

SELECT
   T.year,
   Convert(varchar(2), T.month, 101) + '/' +  Convert(varchar(2), T.day, 101) Week,
   COUNT(*) Registrations
FROM (
   SELECT
      datepart(YEAR, CONVERT(DATE, PH.CreatedOn)) Year,  
      Datepart(month, DATEADD(D, -1 * DATEPART(dw, PH.createdon) + 7,  PH.createdon)) Month,
      Datepart(Day, DATEADD(D, -1 * DATEPART(dw, PH.createdon) + 7,  PH.createdon)) Day
   FROM new_purchasehistory PH
) T
GROUP BY T.Year, T.month, T.day
ORDER BY T.Year DESC, T.Month DESC, T.Day DESC