今天在sql server版上看到2到SQL面试题,有难度,而且看到了sql server下的解决方法,不知道ORACLE下有无相应的解决办法。
原帖参见:http://topic.csdn.net/u/20090608/21/A1FC1E88-83C4-4846-B640-ACE9FAD39D3D.html注:在oracle11g中,已经提供了行转列和列传行的函数,pivot/unpivot,详细用法可百度下
------------------------------------------------------------------------------------
第一是.关于加班时间的问题 
  公司规定一周内最多只能加班和12个小时,多余的要去掉,去掉的规则是:某天加班超过1H的才能去,而且是依次大致平均的去,(最小单位是1小时) 举例: 日期 工号 加班小时 
周一 A001  6 
周二 A001  2 
周三 A001  1 
周四 A001  5 
周五 A001  7 
---------------- 
  共计加班:21H,超出9H 从周一开始依次删减,每天减1H(如果当天的加班时间>1H),一轮后如果还不够,再继续下一轮,直到刚好为12H为止(只对超过12H的而言) 最后的结果应该是: 
日期 工号 加班小时 
周一 A001  3  --减了3次 
周二 A001  1  --减了1次 
周三 A001  1  --减了0次 
周四 A001  2  --减了3次 
周五 A001  5  --减了2次 
----------------------- 
以上只列具体某一个人的,公司有好几千人, 
用SQL语句实现,考虑到效率问题规定: 
1.不能用游标 
2.不能用循环 
其它方法都可以 第二题.求二者的关系 
  男A与女B结婚生了男C 
  男X与女Y结婚生了女Z 
  男C与女Z结婚... 
这就是人间的结婚生子一代传一代的关系 
(要考虑一人多次结婚的情况) 目的: 
设置Table,栏位自定, 
写一SQL函数求出若干年前后的任意两人之间的关系,假定身份证号码不重复,当输入两身份证后就能得出他们的关系 

解决方案 »

  1.   

    看了LZ的问题有点儿头大,至少现在我知道了从oracle 11g中进行行和列转化可以使用函数了,谢谢LZ啦
      

  2.   

    第一题是不难
    第二题的问题:
    1、关系怎么描述?用父亲,母亲,儿子等称谓描述?或者是别的形式?
    2、一人多次结婚,会不会有XX状况出现,比如男A与女B结婚生了男C ,男C跟女B结婚生了女D,女D又跟男A……就是说有没有隔代结婚的,我很纯洁的,仅仅是从技术层面考虑,大家不要BS我
      

  3.   

    先做第一个问题SQL> desc t
    Name Type         Nullable Default Comments 
    ---- ------------ -------- ------- -------- 
    X    INTEGER      Y                星期
    Y    VARCHAR2(10) Y                员工号         
    Z    INTEGER      Y                加班小时         
    A    INTEGER      Y        1       第X周SQL> select * from t;
     
        X Y         Z     A
    ----- ----- ----- -----
        1 A1        6     1
        2 A1        2     1
        3 A1        1     1
        4 A1        5     1
        5 A1        7     1
    SELECT * FROM T
    MODEL PARTITION BY(A,Y)
    DIMENSION BY(X)
    MEASURES (Z S1,Z S)
    RULES ITERATE (10000) UNTIL (s[0] <= 12) (
       S[x>0] ORDER BY x=Greatest(s[cv()]-1,1)+greatest(sign(13-SUM(S)[x>0]),0),
       S[0]=SUM(S)[x>0]);    A Y         X         S1          S
    ----- ----- ----- ---------- ----------
        1 A1        1          6          3
        1 A1        2          2          1
        1 A1        3          1          1
        1 A1        4          5          2
        1 A1        5          7          5
        1 A1        0                    12
    S1指原加班数,S表示计算后的加班数,X=0的数据表示该周的计算加班数,剩下的自己统计了。
      

  4.   

    上面的SQL还是有点问题的。SELECT * FROM T
    MODEL PARTITION BY(A,Y)
    DIMENSION BY(X)
    MEASURES (Z S1,Z S)
    RULES ITERATE (10000) UNTIL (s[0] <= 12) (
       S[x>0] ORDER BY x=Greatest(s[cv()]-1,1)+greatest(sign(12-SUM(S)[x>0]+decode(s[cv()],1,0,1)),0),
       S[0]=SUM(S)[x>0]);
      

  5.   

    强人,能解释一下SQL吗?特别是greatest(sign(12-SUM(S)[x>0]+decode(s[cv()],1,0,1)),0),这段。
      

  6.   

    oracle在10g中加入的关于BI的内容,还没好好攻读那部分内容呢。学无止境啊。
      

  7.   


    应该是pl/sql开发的面试ba