28

次のようなデータベース列「グレード」があるとしましょう。

|grade|
|    1|
|    2|
|    1|
|    3|
|    4|
|    5|

このようなヒストグラムを生成する SQL で重要な方法はありますか?

|2,1,1,1,1,0|

ここで、2 はグレード 1 が 2 回発生することを意味し、1 はグレード {2..5} が 1 回発生することを意味し、0 はグレード 6 がまったく発生しないことを意味します。

ヒストグラムがカウントごとに 1 行であるかどうかは気にしません。

それが重要な場合、データベースは unixODBC/FreeTDS を介して perl CGI によってアクセスされる SQL Server です。

編集:素早い返信ありがとうございます! どのヒストグラム値がどのグレードに属しているかがわかれば、存在しない値 (上の例のグレード 6 など) が発生しなくても問題ありません。

4

7 に答える 7

41
SELECT COUNT(grade) FROM table GROUP BY grade ORDER BY grade

検証していませんが、動作するはずです。ただし、テーブルにまったく存在しないため、6 年生のカウントは表示されません...

于 2009-01-27T21:45:27.927 に答える
14

多数のデータ ポイントがある場合は、次のように範囲をグループ化することもできます。

SELECT FLOOR(grade/5.00)*5 As Grade, 
       COUNT(*) AS [Grade Count]
FROM TableName
GROUP BY FLOOR(Grade/5.00)*5
ORDER BY 1

さらに、全範囲にラベルを付けたい場合は、CTE を使用して床と天井を事前に取得できます。

With GradeRanges As (
  SELECT FLOOR(Score/5.00)*5     As GradeFloor, 
         FLOOR(Score/5.00)*5 + 4 As GradeCeiling
  FROM TableName
)
SELECT GradeFloor,
       CONCAT(GradeFloor, ' to ', GradeCeiling) AS GradeRange,
       COUNT(*) AS [Grade Count]
FROM GradeRanges
GROUP BY GradeFloor, CONCAT(GradeFloor, ' to ', GradeCeiling)
ORDER BY GradeFloor

: 一部の SQL エンジンでGROUP BYは序数列インデックスを使用できますが、MS SQL では、SELECTステートメントでそれが必要な場合は、それによってグループ化する必要があるため、範囲もグループ式にコピーします。

オプション 2 : case ステートメントを使用して値を任意のビンに選択的にカウントし、それらをアンピボットして、含まれる値の行カウントごとに行を取得できます。

于 2016-12-22T03:09:44.713 に答える
7

一時テーブルを使用して欠損値を取得します。

CREATE TABLE #tmp(num int)
DECLARE @num int
SET @num = 0
WHILE @num < 10
BEGIN
  INSERT #tmp @num
  SET @num = @num + 1
END


SELECT t.num as [Grade], count(g.Grade) FROM gradeTable g
RIGHT JOIN #tmp t on g.Grade = t.num
GROUP by t.num
ORDER BY 1
于 2009-01-27T21:49:24.673 に答える
4

Gamecat の DISTINCT の使用は、私には少し奇妙に思えます。オフィスに戻ったら試してみる必要があります...

やり方は似ていますが・・・。

SELECT
    [table].grade        AS [grade],
    COUNT(*)             AS [occurances]
FROM
    [table]
GROUP BY
    [table].grade
ORDER BY
    [table].grade

出現回数が 0 の場合のデータ不足を克服するために、すべての有効な成績を含むテーブルに LEFT JOIN できます。COUNT(*) は NULLS をカウントしますが、COUNT(grade) は NULLS をカウントしません。

DECLARE @grades TABLE (
   val INT
   )  

INSERT INTO @grades VALUES (1)  
INSERT INTO @grades VALUES (2)  
INSERT INTO @grades VALUES (3)  
INSERT INTO @grades VALUES (4)  
INSERT INTO @grades VALUES (5)  
INSERT INTO @grades VALUES (6)  

SELECT
    [grades].val         AS [grade],
    COUNT([table].grade) AS [occurances]
FROM
    @grades   AS [grades]
LEFT JOIN
    [table]
        ON [table].grade = [grades].val
GROUP BY
    [grades].val
ORDER BY
    [grades].val
于 2009-01-27T21:47:59.683 に答える
4

Shlomo Priymak の記事How to Quickly Create a Histogram in MySQLによると、次のクエリを使用できます。

SELECT grade, 
       COUNT(*) AS 'Count',
       RPAD('', COUNT(*), '*') AS 'Bar' 
FROM grades 
GROUP BY grade

次の表が生成されます。

grade   Count   Bar
1       2       **
2       1       *
3       1       *
4       1       *
5       1       *
于 2014-09-06T22:58:56.583 に答える
2
select Grade, count(Grade)
from MyTable
group by Grade
于 2009-01-27T21:46:16.363 に答える
0

Ilya Volodin が上記で行ったことに基づいて構築しています。これにより、結果でグループ化するグレードの範囲を選択できるようになります。

DECLARE @cnt INT = 0;

WHILE @cnt < 100 -- Set max value
BEGIN
SELECT @cnt,COUNT(fe) FROM dbo.GEODATA_CB where fe >= @cnt-0.999 and fe <= @cnt+0.999 -- set tolerance
SET @cnt = @cnt + 1; -- set step
END;
于 2015-08-29T23:40:25.557 に答える