2016-05-22 83 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