2010-01-11 5 views
2

J'ai un tableau qui liste les notes des élèves par classe. Je veux un jeu de résultats qui ressemble à:Mode SQL Server SQL

BIO...B 
CHEM...C 

Lorsque le « B » et « C » sont les modes de la classe. je peux obtenir un mode de tous les grades, mais ne savez pas comment obtenir le mode par classe

+2

Ce n'est pas mode si vous parlez dans un sens statistique. Le mode est l'élément qui apparaît le plus souvent. Dans ce cas, vos deux classes sont bimodales (A, C pour Bio et B, D pour Chem) –

+0

le jeu de résultats que j'ai utilisé n'est pas lié aux valeurs de la table d'exemple que j'ai utilisé – bmw0128

+0

Alors, voulez-vous vraiment le mode? Ou, cherchez-vous la moyenne ou médiane (difficile à dire avec deux valeurs) votre exemple montré? –

Répondre

4

ici, quelque chose comme ça sur 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 

ou peut-être juste:

;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

merci, cela va le faire, mais je regarde dans la façon dont on fait un FDU – bmw0128

0

Vous avez juste besoin GROUP BY ClassName

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

SQL Server dispose-t-il d'une fonction Mode()? – bmw0128

+0

Vous pouvez facilement en écrire un. – JonH

+0

Je suis nouveau dans ce domaine, je ne savais pas que je pourrais, est-il un peu facile de trouver où mettre ma fonction personnalisée, de sorte que mon SQL qui l'appelle peut le trouver? – bmw0128

2

si vous voulez le mode, une solution est ici:

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

si vous voulez que la médiane, consultez cette solution dans SQL Server:

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

couple d'autres solutions pour obtenir la médiane:

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

pourquoi avg ?, je suis à la recherche du mode? – bmw0128

+1

ces liens oreilly ne fonctionnent plus – Slider345

2

Utilisez une clause GROUP BY.

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

Votre fonction Mode() devrait être créé bien sûr, mais ce serait une fonction simple comme:

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

Il y a quelque chose qui manque dans le code de fonction n'est pas? Il semble que le @ClassName n'est pas utilisé du tout. Je pense qu'il devrait chager la clause FROM à "FROM Grades où ClassName = @ClassName" ou chager la clause GROUP BY à GROUP BY ClassName HAVING ClassName = @ClassName. En outre, le SELECT dans le principal, pourrait être simplement Sélectionnez ClassName distinct, ClassMode (ClassName) de Grades. De cette façon, vous avez un mode par nom de classe. Ou est-ce que je me suis trompé? –

+0

Merci pour la capture sur la définition de la fonction - était définitivement manquant le/where. En ce qui concerne les distinctions, vous pourriez certainement faire cela - j'avais l'impression que le PO allait le faire par élève, donc je doute qu'une simple requête puisse accomplir ce dont ils ont besoin de toute façon, mais vous avez raison pour l'exemple donné. – womp

+0

J'ai besoin du mode par classe, donc vous dites que j'ai besoin de modifier cette UDF pour le faire fonctionner? – bmw0128