2016-05-22 54 views
0

目前我在db(SQL开发人员)中有一个名为schedule的表。在SQL开发人员(oracle 11g)中组织查询结果

假设availableID s是1,3,7,8。这个表有这样的事:

Stud  Title Supervisor Examiner availableID  
abc   Hello  1024  1001   1 
def   Hi  1024  1001   1 
ghi   Hey  1002  1004   1 
xxx   hhh  1020  1011   1 
jkl   hhh  1027  1010   1 
try   ttt  1001  1011   1 
654   bbb  1007  1012   1 
gyg   888  1027  1051   1 
yyi   333  1004  1022   3 
fff   111  1027  1041   3 
ggg   222  1032  1007   3 
hhh   444  1007  1001   3 
ppp   444  1005  1072   7 
ooo   555  1067  1009   7 
uuu   666  1030  1010   7 
yyy   777  1004  1001   7 
qqq   yhh  1015  1072   8 
www   767  1017  1029   8 
eee   566  1030  1020   8 
rrr   888  1004  1031   8 
abc   5555  1045  1051   8 

正如你所看到的,我有这些排序使用ORDER BY availableID asc值。 不过,我想再次组织他们弄成这个样子:

Stud  Title Supervisor Examiner availableID  
    abc   Hello  1024  1001   1 
    def   Hi  1024  1001   1 
    ghi   Hey  1002  1004   1 
    xxx   hhh  1020  1011   1 
    yyi   333  1004  1022   3 
    fff   111  1027  1041   3 
    ggg   222  1032  1007   3 
    hhh   444  1007  1001   3 
    ppp   444  1005  1072   7 
    ooo   555  1067  1009   7 
    uuu   666  1030  1010   7 
    yyy   777  1004  1001   7 
    qqq   yhh  1015  1072   8 
    www   767  1017  1029   8 
    eee   566  1030  1020   8 
    rrr   888  1004  1031   8 
    jkl   hhh  1027  1010   1 
    try   ttt  1001  1011   1 
    654   bbb  1007  1012   1 
    gyg   888  1027  1051   1 
    ........ 
    abc   5555  1045  1051   8 

availableID它会调用四次,则继续下一availableID。接下来它将迭代回最低的ID,但使用不同的其他值。 Stud必须是不同的。

是否有可能通过使用sql查询来实现这一点?

回答

1

你可以用row_number()和一些算术来做到这一点。喜欢的东西:

Select t.* 
From (select t.*, 
      Row_number() over (partition by availableid order by stud) as seqnum 
     From t 
    ) t 
Order by trunc((seqnum - 1)/4), availableid 
+0

您好,感谢您的时间。第二个选择查询,我应该添加我想要显示的所有列吗? – user6308605

+0

所以..我试过你的查询。它的工作!谢谢你太多了! – user6308605

+0

我有一个问题...如果我想使用'availableID'和'availableDate'进行排序,我应该做些什么? – user6308605

1

稍微另一种等同方法和上面,使用地板和分区和分组由同一availableID列 -

select a.stud, 
     a.title, 
     a.supervisor, 
     a.examiner, 
     a.availableID 
from (select s.*,row_number() over (partition by availableID order by availableID) rn 
     from student s) a 
order by floor((rn-1)/4),availableID 

+0

嗨谢谢!它也运作得很好。我希望我可以为您的答案投票:D – user6308605

+0

高兴地帮助:) – SubhasisM