今天在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函数求出若干年前后的任意两人之间的关系,假定身份证号码不重复,当输入两身份证后就能得出他们的关系
原帖参见: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、关系怎么描述?用父亲,母亲,儿子等称谓描述?或者是别的形式?
2、一人多次结婚,会不会有XX状况出现,比如男A与女B结婚生了男C ,男C跟女B结婚生了女D,女D又跟男A……就是说有没有隔代结婚的,我很纯洁的,仅仅是从技术层面考虑,大家不要BS我
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的数据表示该周的计算加班数,剩下的自己统计了。
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]);
应该是pl/sql开发的面试ba