2010-01-07 36 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 
相關問題