IT博客汇
  • 首页
  • 精华
  • 技术
  • 设计
  • 资讯
  • 扯淡
  • 权利声明
  • 登录 注册

    [原]---------------------------SQL之机选大乐透,双色球算法-----------------------------

    fredrickhu发表于 2012-12-24 14:28:20
    love 0
     
    ----------大乐透--------------------
    if object_id('Front') is not null
    drop table Front 
    go
    create table Front
    (
    id int ,
    Frontnumber int default 0 ,
    )
    if object_id('Back') is not null
    drop table Back
    go
    create table Back
    (
    id INT,
    Backnumber int default 0 
    )
    /*IF EXISTS (SELECT name FROM sys.indexes WHERE name = N'IX_ID')    
    DROP INDEX IX_ID ON Front ;
    GO
    CREATE CLUSTERED INDEX IX_ID  ON Front(ID);
    GO 
    IF EXISTS (SELECT name FROM sys.indexes WHERE name = N'IX_BackID')    
    DROP INDEX IX_ID ON Back ;
    GO
    CREATE CLUSTERED INDEX IX_BackID  ON Back(ID);
    GO*/
    --随机插入10000条数据
    DECLARE @I INT
    SET @I=1
    WHILE(@I<=10000)
    BEGIN
    INSERT INTO Front VALUES(@I,ABS(CHECKSUM(NEWID()))%33+1)
    SET @I=@I+1
    END
    DECLARE @J INT
    SET @J=1
    WHILE(@J<=10000)
    BEGIN
    INSERT INTO Back VALUES(@J,ABS(CHECKSUM(NEWID()))%12+1)
    SET @J=@J+1
    END
    if OBJECT_ID('SP_DALETOU') IS NOT NULL
    DROP PROC SP_DALETOU
    GO
    CREATE PROC SP_DALETOU
    (
    @I INT
    )
    AS
    BEGIN
    DECLARE @SQL VARCHAR(MAX)
    --DECLARE @N1 INT
    --DECLARE @N2 INT
    --SET @N1=@I
    --SET @N2=@I
    SET @SQL='
    if object_id(''tempdb..#Front'') is not null
    drop table #Front
    create table #Front
    (
    id int ,
    Frontnumber int default 0 ,
    )
    if object_id(''tempdb..#Back'') is not null
    drop table #Back
    create table #Back
    (
    id int ,
    Backnumber int default 0 ,
    )
    insert into #Front select *  from front  order by NEWID() insert into #Back select * from back order by NEWID()'
    SELECT @SQL=@SQL+'
    select
      top '+ltrim(@I)+' *
    from
    (
    select
      C1 AS 前区1,
      C2 AS 前区2,
      C3 AS 前区3,
      C4 AS 前区4,
      C5 AS 前区5
    from
    (
    select
      (ID-1)/5 AS PX,
      MAX(case when ID%5=1 then Frontnumber else 0 end) as c1,
      MAX(case when ID%5=2 then Frontnumber else 0 end) as c2,
      MAX(case when ID%5=3 then Frontnumber else 0 end) as c3,
      MAX(case when ID%5=4 then Frontnumber else 0 end) as c4,
      MAX(case when ID%5=0 then Frontnumber else 0 end) as c5
    from
      #Front
    GROUP BY
      (ID-1)/5
      )t
    where
     c1
    c2 and c1
    c3 and c1
    c4 and c1
    c5 and c2
    c3 and c2
    c4 and c2
    c5 and c3
    c4 and c3
    c5 and c4
    c5)t
    select
      top '+ltrim(@I)+' *
    from
    (
    select
      C6 AS 后区1,
      C7 AS 后区2
    from
    (
    select
     (ID-1)/2 AS PX,
      MAX(case when ID%2=1 then Backnumber else 0 end) as c6,
      MAX(case when ID%2=0 then Backnumber else 0 end) as c7
    from
      #Back
    GROUP BY
      (ID-1)/2
    )t
    where
      c6
    c7)t  '
       
    exec(@SQL)
    END
    GO
    EXEC SP_DALETOU 2
    GO
     
     ---双色球---------
    if object_id('Red') is not null
    drop table Red 
    go
    create table Red
    (
    id int ,
    Rednumber int default 0 ,
    )
    if object_id('Blue') is not null
    drop table Blue
    go
    create table Blue
    (
    id INT,
    Bluenumber int default 0 
    )
    /*IF EXISTS (SELECT name FROM sys.indexes WHERE name = N'IX_RedID')    
    DROP INDEX IX_ID ON Red ;
    GO
    CREATE CLUSTERED INDEX IX_ID  ON Red(ID);
    GO 
    IF EXISTS (SELECT name FROM sys.indexes WHERE name = N'IX_BlueID')    
    DROP INDEX IX_ID ON Blue ;
    GO
    CREATE CLUSTERED INDEX IX_BackID  ON Blue(ID);
    GO */
     
    --随机插入10000条数据
    DECLARE @I INT
    SET @I=1
    WHILE(@I<=10000)
    BEGIN
    INSERT INTO Red VALUES(@I,ABS(CHECKSUM(NEWID()))%35+1)
    SET @I=@I+1
    END
    DECLARE @J INT
    SET @J=1
    WHILE(@J<=10000)
    BEGIN
    INSERT INTO Blue VALUES(@J,ABS(CHECKSUM(NEWID()))%16+1)
    SET @J=@J+1
    END
    if OBJECT_ID('SP_DOUBLE') IS NOT NULL
    DROP PROC SP_DOUBLE
    GO
    CREATE PROC SP_DOUBLE
    (
    @I INT
    )
    AS
    BEGIN
    DECLARE @SQL VARCHAR(MAX)
    --DECLARE @N1 INT
    --DECLARE @N2 INT
    --SET @N1=@I
    --SET @N2=@I
    SET @SQL='
    if object_id(''tempdb..#Red'') is not null
    drop table #Red
    create table #Red
    (
    id int ,
    Rednumber int default 0 ,
    )
    if object_id(''tempdb..#Blue'') is not null
    drop table #Blue
    create table #Blue
    (
    id int ,
    Bluenumber int default 0 ,
    )
    insert into #Red select *  from Red  order by NEWID()  insert into #Blue select * from Blue order by NEWID()'
    SELECT @SQL=@SQL+'
    select
      top '+ltrim(@I)+' *
    from
    (
    select
      C1  as 红球1,
      C2  as 红球2,
      C3  as 红球3,
      C4  as 红球4,
      C5  as 红球5,
      C6  as 红球6
    from
    (
    select
      (ID-1)/6 AS PX,
      MAX(case when ID%6=1 then Rednumber else 0 end) as c1,
      MAX(case when ID%6=2 then Rednumber else 0 end) as c2,
      MAX(case when ID%6=3 then Rednumber else 0 end) as c3,
      MAX(case when ID%6=4 then Rednumber else 0 end) as c4,
      MAX(case when ID%6=5 then Rednumber else 0 end) as c5,
      MAX(case when ID%6=0 then Rednumber else 0 end) as c6
    from
      #Red
    GROUP BY
      (ID-1)/6
      )t
    where
     c1
    c2 and c1
    c3 and c1
    c4 and c1
    c5  and c1
    c6 and c2
    c3 and c2
    c4 and c2
    c5  and c2
    c6 and c3
    c4 and c3
    c5 and c3
    c6 and c4
    c5 and c4
    c6 and c5
    c6)t
    select
      top '+ltrim(@I)+'  Bluenumber  AS  蓝球
    from
      #Blue
    '
       
    EXEC(@SQL)
    END
    GO
    EXEC SP_DOUBLE 2
    GO
     
     
    纯粹是无聊而作。没有优化。不要笑话我。
     
     


沪ICP备19023445号-2号
友情链接