2010-01-07 30 views
0

我有一张单独的表格来存放他们班级的学生成绩。例如,每个班级有30名学生,每个班级有30个分数。 我想为每个班级的每个数据集做一个简单的报告,即平均值,中位数和模式。 因此,每个班级将有一个平均值,一个中位数和一个模式。 我知道SQL Server没有中位数和模式的内置函数,并且我发现了中位数的示例SQL。然而,我发现没有做任何分组的样本,我发现:如何在SQL Server中找到中位数

SELECT 
(
(SELECT MAX(Value) FROM 
    (SELECT TOP 50 PERCENT Value FROM dbo.VOrders ORDER BY Value) AS H1) 
+ 
(SELECT MIN(Value) FROM 
    (SELECT TOP 50 PERCENT Value FROM dbo.VOrders ORDER BY Value DESC) AS H2) 
)/2 AS Median 

是否有可能修改通过,所以我得到每类中的中值增加一个组?


我不;吨觉得我很清楚,我想在SQL返回一个数据集,看起来像这样:

MEDIAN CLASS 
====== ===== 
90  BIO 
77  CHEM 
+0

请向我们展示您的数据架构,如果没有它,几乎不可能提供帮助。 – Hogan 2010-01-07 18:32:04

+0

表名:ALL_SCORES 字段:ID,studentName,得分,类 实施例的数据: 1,本垒打,100,BIO 2,马奇,90,BIO 3,巴特,85,BIO 4,丽萨,100, CHEM 5,henry,55,CHEM 6,jed,77,CHEM 对于每个类,想要统计 – bmw0128 2010-01-07 18:57:58

回答

0

这就是答案:

WITH CTE AS (
SELECT e_id, 
    scale, 
    ROW_NUMBER() OVER(PARTITION BY e_id ORDER BY scale ASC) AS rn, 
    COUNT(scale) OVER(PARTITION BY e_id) AS cn 
FROM waypoint.dbo.ScoreMaster 
WHERE scale IS NOT NULL 
) 
SELECT e_id, 

cast(AVG (cast(scale as decimal(5,2))) as decimal(5,3)) as [AVG], 
cast (STDEV(cast(scale as decimal(5,1))) as decimal(5,3)) as [STDDEV], 
AVG(CASE WHEN 2 * rn - cn BETWEEN 0 AND 2 THEN scale END) AS FinancialMedian, 
MAX(CASE WHEN 2 * rn - cn BETWEEN 0 AND 2 THEN scale END) AS StatisticalMedian 

from CTE 
GROUP BY e_id 
相关问题