现在有数据表TB9如下
ID  M1  M2  M3  M4  M5  M6
1   60  43  21  34  28  60
2   42  53  22  47  28  43
3   60  51  23  46  28  61
4   60  54  24  49  28  43
5   42  47  25  42  28  61
6   51  47  26  41  28  43
7   42  43  27  39  27  61
8   42  44  28  40  27  43
9   60  52  29  48  27  61
10  51  43  30  38  27  43
11  42  45  31  37  27  61
12  42  47  32  42  27  43
13  69  55  33  48  27  61
14  51  42  34  36  27  43
15  42  49  35  40  27  61
16  51  49  36  42  27  43
17  33  47  37  42  27  61
执行以下(引用的是“ABUYING”提供的,谢谢“ABUYING” 指教)脚本
-- 加上decimal(18,2)
select ID,M1,M2,M3,M4,M5,M6
,''AS [平均数],''as [中位数],'' as [方差],cast(sqrt([方差]) 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 [平均数]
,CAST((M3+M4)/2 as decimal(18,2)) AS  [中位数]
,cast(((power((M1-[平均数]),2)+power((M2-[平均数]),2)+power((M3-[平均数]),2)+power((M4-[平均数]),2)+(power((M5-[平均数]),2)+power((M6-[平均数]),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 --外层嵌套  算方差
--最后算标准差但是结果是
消息 156,级别 15,状态 1,第 5 行
关键字 'as' 附近有语法错误。
消息 1035,级别 15,状态 10,第 8 行
'cast' 附近有语法错误,需要 'AS'。
如果有结果是这样的,我不想要
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我想得到的是这样的结果(请仔细对比)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 
请用SQL完成得出我要的结果就好
请教问题一:在SQL2005版本上执行函数后,怎样取函数值的小数点后2位(例如21/6=3.50不是取21/6=3.00应该是21/6=3.50
再次说明,例如20/6=3.33333333333333333现在要取小数部分的2位,就是20/6=3.33
问题二:结果是这样的话如何修改,新手请教,请修改代码(复杂的我看不懂,请高手见谅,请详细一点)
消息 156,级别 15,状态 1,第 5 行
关键字 'as' 附近有语法错误。
消息 1035,级别 15,状态 10,第 8 行
'cast' 附近有语法错误,需要 'AS'。

解决方案 »

  1.   

    ------执行以下(引用的是“ABUYING”提供的,谢谢“ABUYING” 指教)脚本
    这是我借用后修改的,我想有修改错,请指导
      

  2.   

    CAST(20*1.0/6 AS DECIMAL(18,2))
      

  3.   

    try
    select 
      ID,
      M1,M2,M3,M4,M5,M6,
      ''AS [平均数],
      ''as [中位数],
      '' as [方差],
      cast(sqrt([方差]) 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 [平均数]
       ,CAST((M3+M4)/2 as decimal(18,2)) AS  [中位数]
       ,cast
      (
        (power((M1-[平均数]),2)
         +power((M2-[平均数]),2)
         +power((M3-[平均数]),2)
         +power((M4-[平均数]),2)
         +(power((M5-[平均数]),2)+power((M6-[平均数]),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 
      

  4.   

    select 20/6select cast(20/6.0 as decimal(18,2))/*
                
    ----------- 
    3(所影响的行数为 1 行)                     
    -------------------- 
    3.33(所影响的行数为 1 行)
    */
      

  5.   

    我已经回复给你了,再回复一次吧!测试很多,如果直接在SQL算的话,全部取整了。如果直接赋值的话,则可以。
    但在不改变数值的情况下,可以乘以一个很接近于1 的数,但小数多个,则可以。
    你可根据下例子去修改。
    上面出错应该是括号的原因,因没有表结构,所以没运行。
    SQL code
    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 行受影响)
      

  6.   

    dawugui
    (爱新觉罗.毓华)
    方法很好!支持!
    所有的6 改成6.0就行了
    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.0) as decimal(18,2))      AS  [方差]
      from 
            (SELECT  ID,M1,M2,M3,M4,M5,M6,cast(((M1+M2+M3+M4+M5+M6)/6.0) as decimal(18,2))  AS  [平均数] FROM  TB9 ) as a--内层嵌套 算平均数
     ) as b --外层嵌套  算方差
    --最后算标准差