2011-08-08 4 views
1

나는 이렇게 테이블을 가지고있다; 날짜 열을 기준으로 기간 범위를 검색하고 그룹화하려면 어떻게합니까?

jobID - jobTitle - jobCreatedDate

나는 그것이 가능 방문자가 작업 테이블에 검색하고 다음과 같이 그룹화하여 나열 할 수 있도록하려는 난 그냥 하나의 SQL 쿼리를 수행 할 :

Date Added 
- AnyTime (20) 
- 1 day ago (5) 
- 2-7 days ago (2) 
- 8-14 days ago (0) 
- 15-30 days ago (7) 

나는 노력을 그룹 "jobCreatedDate"성공과 나는 필요한 쿼리의 논리를 이해하지 못했습니다. 도움을

Here is an example

감사 : 여기

내가 할 노력하고있어 예입니다.

답변

2

당신은 today과 필드 JobCreated 사이의 날짜 차이를 찾을 필요가있다. 그런 다음 가치 일의 차이에 따라 출력을 요구 사항을 충족하는 다양한 범주로 분류해야합니다.

나는 그것이 당신이 찾고있는 것이기를 바랍니다.

SELECT SUM(1) AS [AnyTime] 
    , SUM(CASE WHEN DayCount = 1     THEN 1 ELSE 0 END) AS [1 day ago] 
    , SUM(CASE WHEN DayCount BETWEEN 2 AND 7  THEN 1 ELSE 0 END) AS [2-7 days ago] 
    , SUM(CASE WHEN DayCount BETWEEN 8 AND 14  THEN 1 ELSE 0 END) AS [8-14 days ago] 
    , SUM(CASE WHEN DayCount BETWEEN 15 AND 30 THEN 1 ELSE 0 END) AS [15-30 days ago] 
FROM  
(
    SELECT  JobID 
      , DATEDIFF(d, JobCreatedDate, GETDATE()) AS DayCount 
    FROM  dbo.Jobs 
) Jobs 

샘플 데이터와 쿼리 출력을 보여주는 스크린 샷입니다.

Output

+0

정확히 내가 필요한 것! 감사 –

0

DATEADD tsql 메서드를 사용하십시오.

Select ... 
From [Table] 
Where JobCreatedDate between DATEADD(dd, @NumDays, GetDate()) and GetDate() 

이 쿼리에서 @NumDays는 현재 날짜에서 뺄 날짜를 나타내는 매개 변수입니다. 쿼리에 음수를 전달해야합니다. 포괄적이지 않은 범위를 만들려고하면 쿼리에 두 개의 매개 변수를 전달하는 두 개의 DATEADD 호출을 사용해야합니다.

EDIT 나는 당신이하려고 한 것을 오해했습니다. 이것은 가장 우아한 해결책은 아니지만, 유니언 쿼리를 사용하여 목표를 달성 할 수 있습니다.

Select sum(OneDay) as OneDay, sum(SevenDays) as SevenDays 
From 
(select 1 as OneDay, 0 as SevenDays 
    From [table] 
    Where JobCreatedDate between DATEADD(dd, -1, GetDate()) and GetDate()) 
    UNION 
(select 0 as OneDay, 1 as SevenDays 
    From[table] 
    Where JobCreatedDate between DATEADD(dd, -7, GetDate()) and DATEADD(dd, -2, GetDate())) 
+0

감사하지만 검색어는 1 개의 날짜 사이의 데이터 만 선택합니다. 시작일과 종료일 사이에 데이터를 선택하는 방법을 알고 있지만 하나의 쿼리로 여러 날짜 사이의 데이터 수를 선택해야합니다. 나는 CASE를 사용해야한다고 생각 하나 모르겠다. :) 예를 들어; 먼저 오늘과 1 주일 전의 데이터 수를 선택한 다음 1 주일 전과 2 주 전에 데이터 수를 선택합니다. 그 그룹 후에 데이터에 의한 결과는 더 높은 것에서 더 낮은 것까지 셀 수 있습니다. –

관련 문제