2013-03-11 32 views
3

我有一個表,其中有一組具有開始標籤和結束標籤的路線。每行都有一個「progres」列,它是應用全球「order by」子句的列,最後是一個選擇列,用於指示必須訂購哪些標籤類型(奇數,偶數或全部)。 如果LabelStart> LabelEnd => ORDER BY ASC另外通過DESC有條件的訂單由

例如這裏的路線路徑

 
Routes 
ID RouteID, Progres, LabelStart, LabelEnd Type 
1 1  5   1   21  O 
2 1  10   10   2  E 
4 2  15   2   25  A 
5 3  20   1   11  O 
6 3  22   4   10  E 
7 4  30   5   11  O 
8 4  31   2   12  E 

這裏屬於路線

 
Points 
PoinID RouteID, Label 
1   1  3   
2   1  2 
4   1  1 
5   1  8 
6   1  5 
7   1  6 
8   1  9 
9   1  21 
10   1  10 
11   1  11 
12   2  1 
13   2  2 
14   2  12 
15   2  3 
16   2  25 
17   2  14 
... 

點我需要的是一個表中所有點由Routes Proges全局排序,由Even,Odd或All根據類型分組,最後由ASC按LabelClass> LabelEnd else DESC排序。結果是768,16:

 
ID RouteID, PointID 
1  1  4   
2  1  1 
4  1  6 
5  1  8 
6  1  11 
7  1  9 
8  1  10 
9  1  5 
10 1  7 
11 1  2 
12 2  13 
13 2  15 
... 

+1

的分組可能很容易與'CASE'語句進行​​處理。儘管動態地切換排序順序,但您可能必須使用PL/PgSQL函數,該函數使用'EXECUTE format(...)USING ...'生成查詢。 – 2013-03-11 22:41:56

+0

爲什麼不能按照子句/ – 2013-03-11 22:54:09

回答

8

SQL Fiddle

select 
    row_number() over() id, * 
from (
    select 
     r.routeid, 
     p.pointid, 
     label, 
     type, 
     labelstart, 
     labelend 
    from 
     route r 
     inner join 
     point p on p.routeid = r.routeid 
    where 
     r.type = 'E' and p.label % 2 = 0 
     or 
     r.type = 'O' and p.label % 2 != 0 
     or 
     r.type = 'A' 
    order by 
     r.routeid, r.progres, r.id, 
     case labelstart < labelend 
      when true then label 
      else label * - 1 
     end 
) s 
+0

的順序確實工作。無論如何,我試圖把Asc和Desc的順序動態的,但它沒有奏效 – amilaishere 2016-11-11 10:11:36