问题标题:
【SQL计算列的问题我要在数据库中加入计算列,比如有a,b,c三列,计算列D=(a+b+c)/3,然后想用E列来存储a,b,c的方差,公式为e=(a-d)*(a-d)+(b-d)*(b-d)+(c-d)*(c-d);第一个问题:SQLServer2008提示“验证列e的公】
问题描述:
SQL计算列的问题
我要在数据库中加入计算列,比如有a,b,c三列,计算列D=(a+b+c)/3,然后想用E列来存储a,b,c的方差,公式为e=(a-d)*(a-d)+(b-d)*(b-d)+(c-d)*(c-d);第一个问题:SQLServer2008提示“验证列e的公式出错”.这是怎么回事.第二个问题,我应该这样设置计算列来存储方差和标准差?.第三个问题,这是一个掷骰子的问题,我要循环的插入三次掷骰子的组合结果,怎么写SQL代码?
李广宇回答:
1.一个计算列中不能引用另一个计算列
2.像这样
create table tt7
(a int
,b int
,c int
,d as (a+b+c)/3.0
,e as (a-(a+b+c)/3.0)*(a-(a+b+c)/3.0)+(b-(a+b+c)/3.0)*(b-(a+b+c)/3.0)+(c-(a+b+c)/3.0)*(c-(a+b+c)/3.0)
)
3.直接插入1到6之间的随机数就行了
insert into tt7 (a,b,c)
values (
ceiling(rand(checksum(newid()))*6),
ceiling(rand(checksum(newid()))*6),
ceiling(rand(checksum(newid()))*6))
需要多行数据的时候,循环执行就好了
任爱爱回答:
如果我要插入的数据为任意两次不重复的呢,比如只插入类似1.2.3,3.5.6的结果,而不差插入类似1.2.2或5.5.6的结果。相当于一个不放回抽样,怎么写代码呢?
李广宇回答:
这个事情比较复杂。为实现从1到6中随机抽取3个数,需要写个存储过程。
--用Knuth洗牌算法在1到M范围内随机抽取n个不重复的整数(n<M)
create procedure usp_KnuthShuffle1(@n int,@M int)
as
begin
--Knuth洗牌算法可以这样描述:
--首先生成一个M维的数组,其中顺序存放着1到M,
--令i从1到M-1循环,
--每次循环中生成从i到M之间的一个随机整数j,
--交换i和j两个位置上的整数
--最后将得到一个随机顺序的新数组
--取出此新数组的前n个,就得到了1到M范围内n个不重复的随机整数
declare @t table(seq int, v int); --seq是序号,v是值
insert into @t
select number,number from master.dbo.spt_values
where number>=1 and number<=@M and type='p'
declare @i int,@j int,@vi int,@vj int;
set @i=0;
while (@i<@M-1)
begin
select @i=@i+1;
set @j=ceiling(rand()*(@M-@i+1))+@i-1;
if (@i!=@j)
begin
select @vi=v from @t where seq=@i;
select @vj=v from @t where seq=@j;
update @t set v=@vi where seq=@j;
update @t set v=@vj where seq=@i;
end
end
declare @sql varchar(8000);
select @sql='select ';
select @sql=@sql+','+convert(varchar,v)
from @t where seq <= @n
order by seq asc;
select @sql=stuff(@sql,8,1,'');
--select @sql
exec(@sql)
end
--存储过程像这样用
insert into tt7 (a,b,c)
exec usp_KnuthShuffle1 3,6
点击显示
其它推荐