新手想写以下代码,(对系统的标准差算法有质疑,自己写的算法)有错误请帮忙纠正
SELECT  ID,M1,M2,M3,M4,M5,M6
,(M1+M22+M33+M44+M55+M6)/6  AS  [平均数]
MEDIAN(M1:M6) AS  [方差]      ---有错误请帮忙纠正
,SQRT([方差])  AS  [标准差]
FROM  TB9
手工用EXCEL统计结果如下
ID  M1  M2  M3  M4  M5  M6     平均数       方差          标准差
1   60  43  21  34  28  60  35.28571429  34.64285714  5.885818307
2   42  53  22  47  28  43  32.33333333  37.16666667  6.096447053
3   60  51  23  46  28  61  35.16666667  40.58333333  6.370504951
4   60  54  24  49  28  43  36.5         39.75        6.304760106
5   42  47  25  42  28  61  31.5         36.75        6.062177826
6   51  47  26  41  28  43  33.16666667  37.08333333  6.089608635
7   42  43  27  39  27  61  30.83333333  34.91666667  5.909032634
8   42  44  28  40  27  43  31.5         35.75        5.979130372
9   60  52  29  48  27  61  37.5         42.75        6.538348415
10  51  43  30  38  27  43  33.16666667  35.58333333  5.965176723
11  42  45  31  37  27  61  32.16666667  34.58333333  5.880759588
12  42  47  32  42  27  43  33.66666667  37.83333333  6.150880696
13  69  55  33  48  27  61  40.83333333  44.41666667  6.664583008
14  51  42  34  36  27  43  34           35           5.916079783
15  42  49  35  40  27  61  34.66666667  37.5         6.123724357
16  51  49  36  42  27  43  36.83333333  39.41666667  6.278269401
17  33  47  37  42  27  61  33.83333333  35.41666667  5.951190357能用SQL完成以下结果就好
请教问题一:在SQL2005版本上执行函数后,怎样取函数值的小数点后2位
问题二:我的方差计算取数的语句有错误如何修改
ID  M1  M2  M3  M4  M5  M6       平均数    方差     标准差
1   60   43   21   34   28   60           35.29    34.64    5.89 
2   42   53   22   47   28   43           32.33    37.17    6.10 
3   60   51   23   46   28   61           35.17    40.58    6.37 
4   60   54   24   49   28   43           36.50    39.75    6.30 
5   42   47   25   42   28   61           31.50    36.75    6.06 
6   51   47   26   41   28   43           33.17    37.08    6.09 
7   42   43   27   39   27   61           30.83    34.92    5.91 
8   42   44   28   40   27   43           31.50    35.75    5.98 
9   60   52   29   48   27   61           37.50    42.75    6.54 
10   51   43   30   38   27   43          33.17    35.58    5.97 
11   42   45   31   37   27   61          32.17    34.58    5.88 
12   42   47   32   42   27   43          33.67    37.83    6.15 
13   69   55   33   48   27   61          40.83    44.42    6.66 
14   51   42   34   36   27   43          34.00    35.00    5.92 
15   42   49   35   40   27   61          34.67    37.50    6.12 
16   51   49   36   42   27   43          36.83    39.42    6.28 
17   33   47   37   42   27   61          33.83    35.42    5.95 

解决方案 »

  1.   

    1、类型设为decimal(18,2)
    2、关于方差查看
    http://aawwmate.blog.163.com/blog/static/7752825620101631746837/
      

  2.   

    SELECT  ID,M1,M2,M3,M4,M5,M6
    ,cast((M1+M22+M33+M44+M55+M6)/6 as decimal(18,2))  AS  [平均数]
    ,cast(MEDIAN(M1:M6) as decimal(18,2)) AS  [方差]     
    ,cast(SQRT([方差]) as decimal(18,2)) AS  [标准差]
    FROM  TB9
      

  3.   

    补充:方差计算我只会
    ((M1-[平均数])*(M1-[平均数])+(M1-[平均数])*(M1-[平均数])+(M1-[平均数])*(M1-[平均数])+(M1-[平均数])*(M1-[平均数])+(M1-[平均数])*(M1-[平均数])+(M1-[平均数])*(M1-[平均数]))/6      AS  [方差]用函数MEDIAN计算[方差]我用的是MEDIAN(M1:M6) AS  [方差] ,有错误但不知道如何改,请教 
      

  4.   


    - -!median是中位数,不是方差,而且具体有这个函数?
      

  5.   

    select ID,M1,M2,M3,M4,M5,M6
    , [平均数],[方差],sqrt([方差]) as 标准差
     from 
    (SELECT  ID,M1,M2,M3,M4,M5,M6,(M1+M22+M33+M44+M55+M6)/6  AS  [平均数],
    (power((M1-[平均数]),2)+power((M2-[平均数]),2)+power((M3-[平均数]),2)+power((M4-[平均数]),2)+(power((M5-[平均数]),2)+power((M1-[平均数]),2))/6      AS  [方差]
    from 
     (SELECT  ID,M1,M2,M3,M4,M5,M6
    ,(M1+M22+M33+M44+M55+M6)/6  AS  [平均数]
    FROM  TB9 ) as a--内层嵌套 算平均数
    ) as b --外层嵌套  算方差
    --最后算标准差
    当然还在cast( aa as decimal(18,2))
      

  6.   

    给你一个计算方差的思路
    1、将表数据行列转化
        id1 id2 ……
    M1  *    *
    M2  *
    M3
    M4
    M5
    M6
    2、用函数VAR:返回值的统计方差。 
    SELECT VAR(id1),VAR(id2),……FROM TB
      

  7.   

    谢谢4和5楼,结合4、5楼的指教得到第一步纠正
    SELECT ID,M1,M2,M3,M4,M5,M6
    ,cast((M3+M4)/2 as decimal(18,2)) AS [中位数]
    ,cast((M1+M2+M3+M4+M5+M6)/6 as decimal(18,2)) AS [平均数]
    ,cast(MEDIAN(M1:M6) as decimal(18,2)) AS [方差]   
    ,cast(SQRT([方差]) as decimal(18,2)) AS [标准差]
    FROM TB9
    但结果
    消息 102,级别 15,状态 1,第 4 行
    'M1' 附近有语法错误。
      

  8.   

    -- 加上decimal(18,2)
    select ID,M1,M2,M3,M4,M5,M6, [平均数],[方差],cast(sqrt([方差]) as decimal(18,2)) as 标准差
     from 
     (SELECT  ID,M1,M2,M3,M4,M5,M6,[平均数],
              cast(((power((M1-[平均数]),2)+power((M2-[平均数]),2)+power((M3-[平均数]),2)+power((M4-[平均数]),2)+(power((M5-[平均数]),2)+power((M1-[平均数]),2))/6) as decimal(18,2))      AS  [方差]
      from 
            (SELECT  ID,M1,M2,M3,M4,M5,M6,cast((M1+M2+M3+M4+M5+M6)/6 as decimal(18,2))  AS  [平均数] FROM  TB9 ) as a--内层嵌套 算平均数
     ) as b --外层嵌套  算方差
    --最后算标准差
      

  9.   


    执行结果
    消息 156,级别 15,状态 1,第 5 行
    关键字 'AS' 附近有语法错误。
    消息 156,级别 15,状态 1,第 9 行
    关键字 'as' 附近有语法错误。
      

  10.   


    谢谢12楼,执行结果
    消息 156,级别 15,状态 1,第 5 行
    关键字 'as' 附近有语法错误。
    消息 1035,级别 15,状态 10,第 8 行
    'cast' 附近有语法错误,需要 'AS'。
      

  11.   

    你是意思是不要任何四舍五入吗?
    测试很多,如果直接在SQL算的话,全部取整了。如果直接赋值的话,则可以。
    但在不改变数值的情况下,可以乘以一个很接近于1 的数,但小数多个,则可以。
    你可根据下例子去修改。
    上面出错应该是括号的原因,因没有表结构,所以没运行。
    declare @var float
    declare @i float
    set @i=1.00000001
    set @var=(20*@i)/6 --这里乘以@i ,值基本无改变,但却变为浮点数了
    select @var 原值,cast(@var as real) 再转,cast(@var as decimal(18,2)) 四舍五入GO
    原值                     再转            四舍五入
    ---------------------- ------------- ---------------------------------------
    3.33333336666667       3.333333      3.33(1 行受影响)