前几天去笔试,考数据库,遇到这样的一个题目:一张记录往期开奖记录的表格CP,里面有八个字段,第一个字段是开奖的期数,剩下的七个字段是代表开奖的七个号码,如图,问题就是①写一个sql语句查询出表中开奖记录的出现次数最多的号码 ②写一个sql语句查询出表中的开奖记录中没有出现过的数字,没有实现的思路,没有写出来,有没有大神帮看一下怎么实现这两个SQL语句啊

解决方案 »

  1.   

    上面两个拿手机回的是空的
    希望对你有启发
    自己设置了一个三列的表实验了一下
    select * from

         select a,count(a) zs
         from
         (
         select a1 a from aa
         union all
         select a2 a from aa
         union all
         select a3 a from aa
          )
          group by a order by zs desc
    )
    where rownum<2
      

  2.   

    1,出现最多的数字,就把所有列的数字查询出来,然后比较count数目,取出最大count数目的数字就行了。
    2,会出现的数字是不是有规则?不然那岂不是有无限多的数字?有规则的话就是查询出所有这些数字,然后不存在于规则内的数字就行了。
      

  3.   

    你提供的图太小,数字太多。
    你列下表字段,提供几组测试数据,以及说明要达到的效果。这样才方便些SQL语句。
      

  4.   

    这样才方便写SQL语句。
      

  5.   

    行转列就简单了,
    双色球是 红球1-33, 篮球1-16, 不区分红蓝一起统计的话
    第一题
    WITH TMP AS
     (SELECT DATE '2017-10-10' - LEVEL AS T_DATE, TRUNC(DBMS_RANDOM.VALUE(1, 34)) N1,
             TRUNC(DBMS_RANDOM.VALUE(1, 34)) N2, TRUNC(DBMS_RANDOM.VALUE(1, 34)) N3,
             TRUNC(DBMS_RANDOM.VALUE(1, 34)) N4, TRUNC(DBMS_RANDOM.VALUE(1, 34)) N5,
             TRUNC(DBMS_RANDOM.VALUE(1, 34)) N6, TRUNC(DBMS_RANDOM.VALUE(1, 17)) N7
      FROM   DUAL
      CONNECT BY LEVEL <= 20)
    SELECT V, C
    FROM   (SELECT V, COUNT(1) C
             FROM   (SELECT V
                      FROM   TMP UNPIVOT(V FOR COL IN(N1, N2, N3, N4, N5, N6, N7)))
             GROUP  BY V
             ORDER  BY C DESC)
    WHERE  ROWNUM = 1第二题
    WITH TMP AS
     (SELECT DATE '2017-10-10' - LEVEL AS T_DATE, TRUNC(DBMS_RANDOM.VALUE(1, 34)) N1,
             TRUNC(DBMS_RANDOM.VALUE(1, 34)) N2, TRUNC(DBMS_RANDOM.VALUE(1, 34)) N3,
             TRUNC(DBMS_RANDOM.VALUE(1, 34)) N4, TRUNC(DBMS_RANDOM.VALUE(1, 34)) N5,
             TRUNC(DBMS_RANDOM.VALUE(1, 34)) N6, TRUNC(DBMS_RANDOM.VALUE(1, 17)) N7
      FROM   DUAL
      CONNECT BY LEVEL <= 20)
    SELECT LEVEL AS L
    FROM   DUAL
    CONNECT BY LEVEL <= 33
    MINUS
    SELECT DISTINCT V
    FROM   (SELECT V
              FROM   TMP UNPIVOT(V FOR COL IN(N1, N2, N3, N4, N5, N6, N7)))
      

  6.   

    楼上第二个SQL可以再优化下:WITH TMP AS
     (SELECT DATE '2017-10-10' - LEVEL AS T_DATE, TRUNC(DBMS_RANDOM.VALUE(1, 34)) N1,
             TRUNC(DBMS_RANDOM.VALUE(1, 34)) N2, TRUNC(DBMS_RANDOM.VALUE(1, 34)) N3,
             TRUNC(DBMS_RANDOM.VALUE(1, 34)) N4, TRUNC(DBMS_RANDOM.VALUE(1, 34)) N5,
             TRUNC(DBMS_RANDOM.VALUE(1, 34)) N6, TRUNC(DBMS_RANDOM.VALUE(1, 17)) N7
      FROM DUAL
      CONNECT BY LEVEL <= 20)
    SELECT LEVEL AS L FROM DUAL CONNECT BY LEVEL <= 33
    MINUS
    SELECT V FROM TMP UNPIVOT(V FOR COL IN(N1, N2, N3, N4, N5, N6, N7))
      

  7.   

    有人看不出来什么意思,可能我描述的也有问题,这就是买彩票的例子啊:一张表用于存储开奖的记录信息的,彩票开奖有期数和对应的七个号码,然后这个表就是设计成包含八个字段,第一个字段存储开奖的期数,剩下的七个字段分别记录那七个数字,数字的包含范围是1-36;
    要求1:写一个sql语句,在给提供的开奖期数中,查出开奖记录中出现次数最多的数字;
    要求2:写一个sql语句,在给提供的开奖期数中,查出开奖记录中从来就没有出现过的数字
    上面的几个大神写了,有更简单的方式吗
      

  8.   

    上面一句话就写出来了,还要多简单...  with子句是构建测试数据的