收录日期:2020/05/27 17:39:52 时间:2016/07/19 11:33:49 标签:疑难问题
有一个列的字段如下:
.44
.45
.78
.34
.71
.28
.1
.3
.61
.71
这个字段的值是一个比率,现在想要对它们来求平均,结果出现了nvarchar 对于 avg 运算符无效。的错,把它转成FLOAT或是NUUMERIC不能都没有成功,转不了,要怎么办呢?
avg(cast(SUBSTRING ( 字段名 ,2, len(字段名)) as int))


Try 一下看看!
----------------------------------------------------------------
-- Author  :fredrickhu(我是小F,向高手学习)
-- Date    :2009-12-28 15:43:44
-- Version:
--      Microsoft SQL Server 2005 - 9.00.4035.00 (Intel X86) 
-- Nov 24 2008 13:01:59 
-- Copyright (c) 1988-2005 Microsoft Corporation
-- Developer Edition on Windows NT 5.2 (Build 3790: Service Pack 1)
--
----------------------------------------------------------------
--> 测试数据:[tb]
if object_id('[tb]') is not null drop table [tb]
go 
create table [tb]([col] varchar(3))
insert [tb]
select '.44' union all
select '.45' union all
select '.78' union all
select '.34' union all
select '.71' union all
select '.28' union all
select '.1' union all
select '.3' union all
select '.61' union all
select '.71'
--------------开始查询--------------------------

select avg(cast(substring(col,2,len(col)-1) as int)) from [tb]
----------------结果----------------------------
/* -----------
43

(1 行受影响)
*/
呵呵写错了。 

select avg(cast(substring(col,2,len(col)-1) as int)) from [tb]


呵呵!
if object_id('[tb]') is not null drop table [tb]
go 
create table [tb]([col] varchar(3))
insert [tb]
select '.44' union all
select '.45' union all
select '.78' union all
select '.34' union all
select '.71' union all
select '.28' union all
select '.1' union all
select '.3' union all
select '.61' union all
select '.71'


select avg(convert(NUMERIC(6,2),'0'+col))
from tb;
if object_id('[tb]') is not null drop table [tb]
go 
create table [tb]([col] varchar(3))
insert [tb]
select '.44' union all
select '.45' union all
select '.78' union all
select '.34' union all
select '.71' union all
select '.28' union all
select '.1' union all
select '.3' union all
select '.61' union all
select '.71'


select avg(convert(NUMERIC(6,2),col))
from tb;
if object_id('[tb]') is not null drop table [tb]
go 
create table [tb]([col] varchar(3))
insert [tb]
select '.44' union all
select '.45' union all
select '.78' union all
select '.34' union all
select '.71' union all
select '.28' union all
select '.1' union all
select '.3' union all
select '.61' union all
select '.71'


select avg(convert(NUMERIC(6,2),col))
from tb;
---------------------------------------------
0.472000
select avg (case when charindex('.',col_name)=1 
 then cast(substring('0'+col_name,1,len(aa)+1) as float) 
                 else cast(col_name as float) end) 
from table_name
select avg (case when charindex('.',col_name)=1 
 then cast(substring('0'+col_name,1,len(col_name)+1) as float) 
                 else cast(col_name as float) end) 
from table_name
select sum(cast (一个列的字段 as decimal(10,4))) from 
--1、2楼是错误的!
引用 10 楼 luoyoumou 的回复:
--1、2楼是错误的!


2楼没错。精确位数问题。 呵呵! 
引用 11 楼 orchidcat 的回复:
引用 10 楼 luoyoumou 的回复:
--1、2楼是错误的!


2楼没错。精确位数问题。 呵呵!


---  .44转换成整型是44, .5转换成整型是5,反而是.44的9分之一了。
---  呵呵........还看不出错在哪吗?


select avg(convert(DECIMAL(6,2),col))
from tb;
---------------------------------------------
0.472000

select cast(SUBSTRING ( col ,2, len(col)) as int)
from tb;
-------------------------------------------------------
44  --.44变成44
45
78
34
71
28
1
3    --.3 变成3
61
71

-- 44是3的多少倍?而0.44是0.3的多少倍?
--呵呵....................................

--这样的低级错误,我说了大半天,竟然没有人能够理解!
--我只能说,两个字:悲哀!
引用 13 楼 luoyoumou 的回复:
SQL codeselectavg(convert(DECIMAL(6,2),col))from tb;---------------------------------------------0.472000selectcast(SUBSTRING ( col ,2,len(col))asint)from tb;------------------------------------------?-



原来是要说明这个。 确实欠考虑了。 楼上说的对。 考虑不周,还请指正!
向高手学习!
引用 9 楼 acmain_chm 的回复:
select sum(cast (一个列的字段 as decimal(10,4))) from

看来还是越简单越好用。

1> select * from tb
2> go
col
---
.44
.45
.78
.34
.71
.28
.1
.3
.61
.71

(10 rows affected)
1> select sum(cast (col as decimal(10,4))) from tb
2> go

----------------------------------------
                                  4.7200

(1 rows affected)
1>
mark  学习
DECLARE @v VARCHAR(10)
SELECT @v='.54'
SELECT CAST(@v AS NUMERIC(16,2))
--------------------------------------
0.54

ExtJs中关于Prompt方法 一个C#调用fortran dll的问题 怎样在外部设置JS中属性的值 Mysql trigger 问题 java json ID3DXSprite显示图片怎么灰度化 关于if语句的问题 C#新手问题 怎样判断txexbox中的文本是不是网址 关于控件的隐藏 是否可以写一个js函数 传入字符串 得到日期 求人帮忙Linux驱动中 设备注册的问题 Mysql trigger 问题 请各位帮忙那个主意,希望各位回答一下小弟的问题 C#怎么调用JS变量? 我想点击上半部分,和下半部分,我要分开执行,在单击事件里该怎么写呀? 请问如何判断两个Jar是否同一个项目编译出来的? C菜鸟的简单问题 在线等 请问各位已经工作的朋友 找C++工作 应该都会什么? 初学JAVA用什么教材好 ######### 求javascript的format(\"InsertImage\",...)参数详解 ########## c#中方法的返回值类型的问题 怎么ReleaseSemaphore释放信号灯后,等待这个信号灯的另一进程不被唤醒 简单描述网卡LED提供的信息,如何从LED上确定速率和通信模式 绯闻乎?真相乎? 给定一个目录,重命名该目录下的所有文件 求解,关于检查数据窗口的输入的数据是否重复 x哥 repeater 下面如何用异步刷新啊 连接错误 关于GIS