当前位置: 代码迷 >> Sql Server >> sqlserver 中用随机数初始化表的有关问题
  详细解决方案

sqlserver 中用随机数初始化表的有关问题

热度:52   发布时间:2016-04-24 09:06:24.0
sqlserver 中用随机数初始化表的问题
需要初始化表,以便测试。表结构如下:

要求是,组织代码001不变,日期从20140201开始一直到20140430,每一天对应一条数据,d1为2500~3200间的随机数,d2为0~1之间的随机数,当d2为1是,d3随机填写"较大",”严重“,”特大“三个中的一个。求大神 这个初始化表的sql该怎么写?
------解决思路----------------------
DECLARE @days int
DECLARE @seed int
SET @days = DateDiff(day,'2014-02-01','2014-04-30') + 1
SET @seed = 2147483647 / @days

;WITH t1 AS (
    SELECT number
      FROM master..spt_values
     WHERE type = 'p'
       AND number < @days
)
,t2 AS (
    SELECT DateAdd(day,number,'2014-02-01') [date],
           RAND(number*@seed) d0
      FROM t1
)
-- INSERT INTO 表1
SELECT '001' Ocode,
       [date],
    -- d0,
       Convert(int,2500+d0*(3200-2500)) d1,
       CASE WHEN d0<0.5
            THEN 0
            ELSE 1
       END d2,
       CASE WHEN d0<0.5 THEN ''
            WHEN d0<0.666666 THEN '较大'
            WHEN d0<0.833333 THEN '严重'
            ELSE '特大'
       END d3
  FROM t2

------解决思路----------------------
INSERT INTO TB
SELECT [Ocode],[date],[d1],[d2]
,CASE WHEN [d2]=1 THEN[d3]ELSE''END[d3]
FROM(
SELECT '001'[Ocode],CONVERT(VARCHAR(10),DATEADD(DAY,number,@StartDate),120)[date]
,CAST(CAST(RIGHT(ABS(CHECKSUM(NEWID())),4)AS DECIMAL(19,4))/9999*700+2500 AS INT)[d1]
,RIGHT(ABS(CHECKSUM(NEWID())),1)%2 [d2]
,CASE RIGHT(ABS(CHECKSUM(NEWID())),3)%3 WHEN 0 THEN'较大'WHEN 1 THEN'严重'ELSE'特大'END[d3]
FROM master..spt_values
WHERE type='P' AND number<DATEDIFF(DAY,@StartDate,@EndDate)
)T
  相关解决方案