5

http://sqlfiddle.com/#!3/8e018/1に問題の詳細があります

私はすべての学生のマークを持つメンバーのテーブルを持っています. 次のような範囲内のすべての学生の数を取得しようとしています

0-9 = 生徒数 9 ,

10 -19 = 生徒数 0 など、最大 100 まで。

さらに、ケースステートメントに関する素晴らしいチュートリアルを誰かが指摘できれば、非常に良いでしょう

与えられた答えは問題ありません。しかし、私の範囲は固定されています。申請者がいない場合も0を表示する必要があります 。これが私の質問の主な違いです。私もカテゴリを表示しているように。

4

3 に答える 3

14

CASE声明は必要ありません。整数除算の結果でグループ化できます。

SELECT 10 * ( marks / 10 )     AS start_range,
       10 * ( marks / 10 ) + 9 AS end_range,
       count(*)                AS COUNT
FROM   testTable
GROUP  BY marks / 10 

これでグループ化されます

0  -  9
10 - 19
/* ...*/
90 - 99
100 - 109

範囲内に単独で存在したくない場合100(最終範囲で唯一可能な値として)、要件をより明確に定義する必要があります。

使用できるすべての範囲を含めるには

SELECT CAST(10 * ( G.Grp ) AS VARCHAR(3)) + '-' 
                          + CAST(10 * ( G.Grp ) + 9 AS VARCHAR(3)) AS range,
       count(T.id)                                                 AS Count
FROM   (VALUES (0),(1),(2),(3),(4),(5),(6),(7),(8),(9),(10)) G(Grp)
       LEFT JOIN [dbo].[testTable] T
         ON G.Grp = T.marks / 10
GROUP  BY G.Grp 

SQL フィドル

于 2013-02-06T13:39:08.777 に答える
3

次のようなものを試してください:

SELECT CASE
        WHEN marks IS NULL THEN 'Unknown'
        WHEN marks <= 9 THEN '0-9'
        WHEN marks <= 19 THEN '10-19'
        WHEN marks <= 29 THEN '20-29'
        WHEN marks <= 39 THEN '30-39'
        WHEN marks <= 49 THEN '40-49'
        WHEN marks <= 59 THEN '50-59'
        WHEN marks <= 69 THEN '60-69'
        WHEN marks <= 79 THEN '70-79'
        WHEN marks <= 89 THEN '80-89'
        WHEN marks <= 100 THEN '90-100'
        ELSE 'Over 100'
    END "Bucket",
    COUNT(*) "Number of results"
FROM
    testTable
GROUP BY CASE
        WHEN marks IS NULL THEN 'Unknown'
        WHEN marks <= 9 THEN '0-9'
        WHEN marks <= 19 THEN '10-19'
        WHEN marks <= 29 THEN '20-29'
        WHEN marks <= 39 THEN '30-39'
        WHEN marks <= 49 THEN '40-49'
        WHEN marks <= 59 THEN '50-59'
        WHEN marks <= 69 THEN '60-69'
        WHEN marks <= 79 THEN '70-79'
        WHEN marks <= 89 THEN '80-89'
        WHEN marks <= 100 THEN '90-100'
        ELSE 'Over 100'
    END
ORDER BY
    MIN(marks);

ここでのステ​​ートメントを説明するためにCASE(できる限り、より良い人が編集できるように)、クエリでエラーが発生することがあるため、常にNULLオプションを入力するのが好きです。残りのWHENステートメントは自明である必要があり、ニーズに合わせて使用​​できます。「バケット」という名前は、最終出力で列が呼び出される名前であるため、必要に応じて変更できます。2番目の列は、ステートメントが意味をなすCOUNTためなど、集計クエリである必要があります。CASE

CASEステートメント内で、名前を除いてステートメントを繰り返す必要がありますGROUP BY

于 2013-02-06T13:45:56.610 に答える
1

空の範囲も必要な場合(私は推測します)、これを試してください:

;WITH Ranges
AS
(
  SELECT 0 n
  UNION ALL
  SELECT n + 1 FROM Ranges
  WHERE n < 9
)
SELECT CAST((n*10) as VARCHAR) + ' - ' + CAST((n*10 + 9) as VARCHAR) [Range], COUNT(marks) Cnt FROM Ranges
  LEFT JOIN [testTable] T
    ON marks >= (n*10) AND marks <= (n*10 + 9)
GROUP BY n*10, n*10 + 9

SQL FIDDLE DEMO

于 2013-02-06T13:58:14.177 に答える