1

SQL Server を使用しています。datepart 関数を使用して情報を週ごとに並べ替えようとすると、値が返されません。選択した日付範囲のテーブルに値があります。

私が使用しようとしているクエリは次のとおりです。

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
4

2 に答える 2

5

[DateWeek]は日付ではなく、数字 (1 ~ 53) です。

また...

WHERE句を最初の CTE に移動します。

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]
)
于 2012-04-24T20:51:41.460 に答える
4

整数を日付と比較しています。

DATEPART(ww...)数値の週を返します (つまり、年の第 3 週は 3)。あなたの比較はdatetime、直接比較できないものです。

日付の週と比較する必要があり、年も確認する必要があります。週だけを確認するには:

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

年を CTE に追加して比較する必要があります。そうしないと、2012 年 1 月 15 日と 2011 年 1 月 9 日が同じ「週」に表示されます。

于 2012-04-24T20:50:55.093 に答える