2012-04-24 3 views
1

SQL Server를 사용하고 있습니다. datepart 함수를 사용하여 주별 정보를 정렬하려고하면 아무 값도 반환하지 않습니다. 내 표에는 선택한 기간에 대한 값이 있습니다.SQL Server - 날짜 단위로 정렬

내가 사용하려고 쿼리는 : 나는 일에 의해 정보를 당길 수 있지만, 나는 주에를 정렬하는 방법을 알아낼 수 없습니다

Declare @StartDate datetime, @EndDate datetime 
set @StartDate = '20120401 00:00:00' 
set @EndDate = '20120430 23:59:59' 
;WITH 
mytablePlusHours As 
(
SELECT *, 
    DATEPART(ww, [eci_date])  AS [dateWeek] 
FROM [mytable]  
) 
, mytableHourGroups As 
(
SELECT dateWeek, 
     [eci_country], 
     COUNT(*)  As [Number_Country], 
     ROW_NUMBER() OVER(PARTITION BY dateWeek ORDER BY [eci_country]) 
         As [Country_Rank] 
FROM  mytablePlusHours 
GROUP BY dateWeek, [eci_country] 
) 
SELECT 
    dateWeek  AS [eci_date], 
    [eci_country], 
    [Number_Country] 
FROM mytableHourGroups WITH(NOLOCK) 
WHERE [dateWeek] between @StartDate and @EndDate 
ORDER BY [dateWeek], [Number_Country] DESC 

. 누군가 제 코드가 잘못된 부분을 알려주실 수 있습니까? 감사!

내가 좋아하는 내 데이터를 표시하는 것을 시도하고있다 :

Week Country  Count 
16 United States 13 
17 Canada   41 
+0

그래서 당신은'[dateWeek] BY'주문을 기리는되지 않은 말? 국가별로 정렬 하시겠습니까? –

+0

@AaronBertrand 그는 모든 주를 날짜로 비교하여 모든 행을 걸러냅니다. – JNK

+0

아, 그럼 행이 없습니다. 올바르게 분류되지 않은 행이 있다고 생각했습니다. –

답변

5

[DateWeek]은 (1 ~ 53) 숫자가 아닙니다.

중 하나는 ...

귀하의 첫 번째 CTE에 WHERE 절을 이동

.

mytablePlusHours As 
(
    SELECT *, DATEPART(ww, [eci_date])  AS [dateWeek] 
    FROM [mytable] 
    WHERE [eci_date] between @StartDate and @EndDate 
) 

또는 날짜를 반환하는 함수에 DATEPART() 변경 ...

mytablePlusHours As 
(
    SELECT *, DATEADD(WEEK, DATEDIFF(WEEK, 0, [eci_date]), 0) AS [dateWeek] 
    FROM [mytable] 
) 
+0

월요일은 토요일에 어떻게 시작할 것인가? – Brad

+0

@ 브래드 - 나는 집과 아이폰에 있기 때문에 테스트 할 수는 없지만 이런 식으로'DATEADD (WEEK, DATEDIFF (주, 0, [eci_date] +2), -2) * [+ 2]는 날짜를 상쇄하므로 Sat-Fri은 모두 DATEDIFF()에서 동일한 결과를 제공하고, '-2'는 결과를 토요일로 다시 상쇄합니다. 바라건대. * – MatBailie

+0

완벽하게 작동했습니다. 감사! – Brad

4

당신은 날짜의 정수를 비교하고 있습니다.

DATEPART(ww...)은 숫자로 된 주를 반환합니다 (예 : 세 번째 주에 3). 귀하의 비교는 직접 비교할 수없는 datetime입니다.

날짜의 주간을 비교해야하며 연도도 확인해야합니다.

WHERE [dateWeek] between DATEPART(ww,@StartDate) and DATEPART(ww,@EndDate) 

당신은 당신의 CTE에 년을 추가 할뿐만 아니라, 그렇지 않으면 2012년 1월 15일 및 2011년 1월 9일이 같은 "주"에 표시됩니다 둘 것을 비교해야한다 : 단지 일주일 확인하십시오.