SQL Server: dates de groupe par plages

J'ai une table SQL avec une colonne (dateRec) contenant des dates, format: aaaa-mm-jj.

Existe-t-il un moyen, dans SQL, de définir des plages de dates, puis de regrouper tous les éléments dans ces plages? J'aurais besoin des groupes suivants ici:

  • groupe un = 0 – 7 jours
  • groupe deux = 8 – 14 jours
  • groupe trois = 15 – 30 jours
  • groupe quatre = 31 – 60 jours
  • groupe cinq = repos

Ma requête standard pour récupérer tous les éléments de cette table:

CREATE PROCEDURE [dbo].[FetchRequests] AS BEGIN SET NOCOUNT ON; SELECT subject, dateRec, category FROM LogRequests WHERE logStatus = 'active' ORDER BY dateRec desc, subject FOR XML PATH('items'), ELEMENTS, TYPE, ROOT('ranks') END 

Merci pour votre aide, Tim.

Vous devez faire quelque chose comme ça

 select t.range as [score range], count(*) as [number of occurences] from ( select case when score between 0 and 9 then ' 0-9 ' when score between 10 and 19 then '10-19' when score between 20 and 29 then '20-29' ... else '90-99' end as range from scores) t group by t.range 

Cochez ce lien En SQL, comment pouvez-vous "grouper par" dans les plages?

Oui, vous pouvez le faire en ajoutant une nouvelle colonne qui contient toutes les bandes dont vous avez besoin, puis regroupez par colonne:

  SELECT subject, dateRec, category ,case when datediff(day,dateRec,Getdate())<='7' then '0 - 7 days old' when datediff(day,dateRec,Getdate()) between '8' and '14' then '8 - 14 days old' when datediff(day,dateRec,Getdate()) >60 then 'rest' end Classes into #temp1 FROM LogRequests WHERE logStatus = 'active' ORDER BY dateRec desc, subject 

J'ai manqué quelques-unes de vos plages, mais j'espère que vous avez la logique

puis Groupez par cette colonne:

  select classs, Count(*) from #temp1 begin drop table #temp1 end 
 WITH ranges AS ( SELECT range_id, ISNULL(DATEADD(day,range_start,CAST(GETDATE() AS date)),'0000-01-01') range_start, ISNULL(DATEADD(day,range_end ,CAST(GETDATE() AS date)),'9999-12-31') range_end FROM (VALUES (1, -7, 0), (2, -14, -8), (3, -30,-15), (4, -60,-31), (5,NULL,-61) ) r(range_id,range_start,range_end) ) SELECT subject, range_id, category COUNT(*) AS c, FROM LogRequests WHERE logStatus = 'active' INNER JOIN ranges ON dateRec BETWEEN range_start AND range_end GROUP BY subject,category,range_id ORDER BY range_id desc, subject