HELLO456 2017-11-03 06:05 采纳率: 0%
浏览 788
已结题

根据条件 SQL SERVER 数据模拟

要求:有一个最小值 平均值 最大值 以及数的个数 ,编写一个SQL(函数) 模拟出中间所有的数据,但是最小值和最大值必须出现,以及模拟出的数据的平均值必须满足前面的平均值的要求。

比如: 最小值:300    平均值:350   最大值:400  数值个数为:6个  

结果(只需要满足条件的一种就OK):300(1个) 320(2个) 380(2个) 400(1个) 
  • 写回答

1条回答 默认 最新

  • samzhu 2017-12-20 12:03
    关注

    create view view_rand
    as
    SELECT rand() as rd
    go

    create function f_Rand()
    returns float
    as
    begin
    return (select rd from view_rand)
    end
    GO

    Create FUNCTION RandomNumbers(@Max INT,@Min INT, @Avg INT, @Cnt INT)
    RETURNS @tab table(a INT)
    AS BEGIN
    DECLARE @tmpTable table (id int ,a int)
    DECLARE @remain INT = @avg*@cnt -@Max -@Min*(@Cnt-1)
    IF(@remain <= 0 OR @Cnt <=0)
    return
    DECLARE @i INT = @Cnt -2
    WHILE @i > 0
    BEGIN
    INSERT INTO @tmpTable VALUES (@i,@Min)
    SET @i = @i - 1
    END;

    DECLARE @id int
    WHILE @remain>0 BEGIN
    SET @id =CEILING(dbo.f_Rand()*(@Cnt-2))
    IF @id =0
    SET @i =1
    UPDATE @tmpTable SET a=a+1 WHERE id= @id
    SET @remain=@remain -1
    end
    INSERT INTO @tab values (@Max),(@Min)
    INSERT INTO @tab SELECT a FROM @tmpTable
    return
    END
    GO
    --测试
    SELECT * FROM dbo.RandomNumbers(400,100,240,5)

    评论

报告相同问题?

悬赏问题

  • ¥15 C++ yoloV5改写遇到的问题
  • ¥20 win11修改中文用户名路径
  • ¥15 win2012磁盘空间不足,c盘正常,d盘无法写入
  • ¥15 用土力学知识进行土坡稳定性分析与挡土墙设计
  • ¥70 PlayWright在Java上连接CDP关联本地Chrome启动失败,貌似是Windows端口转发问题
  • ¥15 帮我写一个c++工程
  • ¥30 Eclipse官网打不开,官网首页进不去,显示无法访问此页面,求解决方法
  • ¥15 关于smbclient 库的使用
  • ¥15 微信小程序协议怎么写
  • ¥15 c语言怎么用printf(“\b \b”)与getch()实现黑框里写入与删除?