2010-01-11 89 views
2

我有一張表列出了每個班級學生的成績。 我想要的結果集看起來像:SQL Server模式SQL

BIO...B 
CHEM...C 

其中「B」和「C」是該類的模式。 我可以得到所有等級的方式,但不知道如何讓每類模式

+2

這不是模式,如果你是在統計意義上說話。模式是最常出現的元素。在這種情況下,你的兩個類都是雙模態的(A,C代表Bio和B,D代表Chem) – 2010-01-11 21:29:33

+0

我使用的結果集與我使用的示例表值無關 – bmw0128 2010-01-11 21:35:03

+0

那麼你真的想要模式嗎?或者,您是否在尋找您的示例顯示的平均值或中值(難以用兩個值來判斷)? – 2010-01-11 21:38:08

回答

4

這裏,像這樣的SQL 2005/2008:

;WITH 
    Counts AS (
    SELECT ClassName, Grade, COUNT(*) AS GradeFreq 
    FROM Scores 
    GROUP BY ClassName, Grade 
    ) 
, Ranked AS (
    SELECT ClassName, Grade, GradeFreq 
    , Ranking = DENSE_RANK() OVER (PARTITION BY ClassName ORDER BY GradeFreq DESC) 
    FROM Counts 
    ) 
SELECT * FROM Ranked WHERE Ranking = 1 

或者只是:

;WITH Ranked AS (
    SELECT 
    ClassName, Grade 
    , GradeFreq = COUNT(*) 
    , Ranking = DENSE_RANK() OVER (PARTITION BY ClassName ORDER BY COUNT(*) DESC) 
    FROM Scores 
    GROUP BY ClassName, Grade 
) 
SELECT * FROM Ranked WHERE Ranking = 1 
+0

謝謝,這將做到這一點,但我正在研究如何做一個UDF – bmw0128 2010-01-11 22:36:09

0

你只需要GROUP BY ClassName

SELECT ClassName, MODE(Grade) FROM YourTable GROUP BY ClassName 
+1

SQL Server有一個Mode()函數嗎? – bmw0128 2010-01-11 21:35:40

+0

你可以很容易地寫一個。 – JonH 2010-01-11 21:41:13

+0

我是這方面的新人,不知道我能不能找到自己的自定義函數的位置,以便我的SQL調用它可以找到它? – bmw0128 2010-01-11 21:43:53

2

,如果您想要的模式,一個解決方案是在這裏:

http://oreilly.com/catalog/transqlcook/chapter/ch08.html 
"Calculating a Mode" 

,如果你想在中間,看看在SQL Server此解決方案:

http://oreilly.com/catalog/transqlcook/chapter/ch08.html 
scroll to "Calculating a Median" 

其他解決方案獲得中位數:

http://www.sqlmag.com/Files/09/49872/Listing_05.txt 
http://www.tek-tips.com/faqs.cfm?fid=4751 
+0

爲什麼avg ?,我正在尋找模式? – bmw0128 2010-01-11 21:38:02

+1

這些oreilly鏈接不再工作 – Slider345 2015-05-20 20:16:45

2

使用GROUP BY子句。

SELECT className, ClassMode(className) 
FROM Grades 
GROUP BY className 

你的模式()函數將不得不當然被創建,但它會像一個簡單的函數:

CREATE FUNCTION ClassMode(@ClassName varchar(50)) 
RETURNS varchar(2) 
AS 
BEGIN 
    Declare @temp varchar(2) 

    SELECT @temp = TOP 1 Grade, COUNT(*) Grades as frequency 
    FROM Grades 
    WHERE ClassName = @ClassName 
    GROUP BY ClassName 
    ORDER BY frequency DESC 

    RETURN @temp 
END 
+0

功能代碼中缺少某些東西不是嗎?看起來好像@ClassName根本不用。我認爲它應該將FROM子句變爲「FROM Grades where ClassName = @ClassName」或將GROUP BY子句變爲GROUP BY ClassName HAVING ClassName = @ClassName。 另外,主要中的SELECT可以簡單地從Grades中選擇不同的ClassName,ClassMode(ClassName)。這樣您每個ClassName都有一個模式。還是我得到這個錯誤? – 2010-01-11 22:01:01

+0

感謝您對函數定義的理解 - 絕對錯過了where/having。至於截然不同的情況,你可以肯定做到這一點 - 我在OP的印象中會給每個學生做這件事,所以我懷疑這個簡單的查詢會完成他們需要的東西,但是對於給定的例子你是正確的。 – womp 2010-01-11 22:30:11

+0

我需要每班的模式,所以你說我需要修改這個UDF使它工作? – bmw0128 2010-01-11 22:44:07