1

コースを完了するのに平均でどのくらいの時間がかかるかを示す表があります (コースごと)。

学生名 | コース | コース完了までの時間

ジョニー | フランス語 | 2
ショーン | 英語 | 3
バーバラ | フランス語 | 8

今、私はそれを分類したいと思います:

コース | 完了までの平均時間 | カテゴリー

フランス語 | 4 | 2-4ヶ月
英語 | 3 | 1-3ヶ月

ご覧のとおり、それらを 3 か月ごとに分類したいと思います。Caseステートメントを使用することは知っていますが、mod 3などを使用することで、これをよりスマートに処理できると思います...

アイデア/提案はありますか?

これは私が今持っているものです

        Category = CASE
            WHEN avg(TimeToCompleteCourse) <=3 THEN '1-3 months'
            WHEN avg(TimeToCompleteCourse) >=4 AND avg(TimeToCompleteCourse) <=6  THEN '4-6 months'
            WHEN avg(TimeToCompleteCourse) >=7 AND avg(TimeToCompleteCourse) <=9  THEN '7-9 months'
            WHEN avg(TimeToCompleteCourse) >=10 AND avg(TimeToCompleteCourse) <=12  THEN '10-12 months'
            WHEN avg(TimeToCompleteCourse) >=13 AND avg(TimeToCompleteCourse) <=15  THEN '13-15 months'
            WHEN avg(TimeToCompleteCourse) >=16 AND avg(TimeToCompleteCourse) <=18  THEN '16-18 months'
            WHEN avg(TimeToCompleteCourse) >=19 AND avg(TimeToCompleteCourse) <=21  THEN '18-21 months'
            WHEN avg(TimeToCompleteCourse) >=22 AND avg(TimeToCompleteCourse) <=24  THEN '22-24 months'
            WHEN avg(TimeToCompleteCourse) >=25 AND avg(TimeToCompleteCourse) <=27  THEN '25-27 months'
            WHEN avg(TimeToCompleteCourse) >=28   THEN 'Way too long!'
        END
4

2 に答える 2

3

私の意見では、これにはモジュラス演算子は必要ありません。mod 演算子は、整数除算の余りを返します (11 mod 3 = 2)。代わりに、最も近い 3 か月間隔に丸めたいと思います。より具体的には、平均期間を取得し、最も近い 3 に丸めます。

これを試して:

Select  Course,
        Avg(TimeToCompleteCourse) As AvgTimeToComplete,
        Convert(VarChar(4), Ceiling(Avg(TimeToCompleteCourse) / 3.0) * 3 - 2)
        + ' - ' +
        Convert(VarChar(4), Ceiling(Avg(TimeToCompleteCourse) / 3.0) * 3)
        + ' Months' As Category
From    YourTableName
Group By Course

そのうちの 1 つに -2 が付いている計算を繰り返すことに注意してください。これは、値の範囲を示すためのものです。

于 2012-07-04T16:55:04.720 に答える
2

これは(醜いですが)すべてのモジュロ値に対してトリックを行うはずです:

select 
course
,CASE WHEN AVG(timetocompletecourse) > 27 THEN 'Way too long'
        WHEN AVG(timetocompletecourse) < 4 THEN '1-3 Months'
        WHEN AVG(timetocompletecourse)%3 = 0 THEN CAST(AVG(timetocompletecourse)-2 AS VARCHAR(2)) + '-' + CAST(AVG(timetocompletecourse) AS VARCHAR(2)) + ' Months'
        WHEN AVG(timetocompletecourse)%3 = 1 THEN CAST(AVG(timetocompletecourse) AS VARCHAR(2)) + '-' + CAST(AVG(timetocompletecourse)+2 AS VARCHAR(2)) + ' Months'
        WHEN AVG(timetocompletecourse)%3 = 2 THEN CAST(AVG(timetocompletecourse)-1 AS VARCHAR(2)) + '-' + CAST(AVG(timetocompletecourse)+1 AS VARCHAR(2)) + ' Months'
        END as rangename
FROM yourtable
GROUP BY 
course
于 2012-07-04T15:44:56.243 に答える