2011-10-11 24 views
1

我在postgres中使用了交叉表函數。基本的SQL是:crosstab()查詢移位列

select distinct 
     o_location, 
     co_name, 
     o_date, 
     o_ndate, 
     o_day, 
     o_hour, 
     o_type 
    from outputs_txt 
    left join courses on o_course = co_foreign 
    left join locations on o_location = l_code 
where o_date = '2011-10-10' 
order by o_hour 

我的交叉表查詢是

SELECT * 
    FROM crosstab(
'SELECT DISTINCT 
     COALESCE(o_location, '''') 
     ,o_hour AS hour 
     ,c.co_name 
    FROM outputs_txt AS d 
    LEFT JOIN courses AS c 
    on o_course = c.co_foreign 
    LEFT JOIN locations as a 
    on o_location = a.l_code 
    WHERE d.o_date = ''2011-10-10''' 
) 
AS ct(
o_location varchar 
,hour_0 varchar 
,hour_1 varchar 
,hour_2 varchar 
,hour_3 varchar 
,hour_4 varchar 
,hour_5 varchar 
,hour_6 varchar 
,hour_7 varchar 
,hour_8 varchar 
,hour_9 varchar 
,hour_10 varchar 
,hour_11 varchar 
,hour_12 varchar 
,hour_13 varchar 
,hour_14 varchar 
,hour_15 varchar 
,hour_16 varchar 
,hour_17 varchar) 

的問題是,結果全部左移。
例如,如果某個位置的課程顯示在hour_8上,則顯示在hour_0中。
這是所有地點的所有課程。他們全部左對齊。

我哪裏錯了?

回答

1

由於沒有樣本數據,我只能猜測。這裏是什麼打擊我:
在您的交叉表功能中沒有ORDER BY。我補充一個:

SELECT * 
    FROM crosstab(
'SELECT DISTINCT 
     COALESCE(o_location, '''') 
     ,o_hour AS hour 
     ,c.co_name 
    FROM outputs_txt AS d 
    LEFT JOIN courses AS c ON o_course = c.co_foreign 
    LEFT JOIN locations as a ON o_location = a.l_code 
    WHERE d.o_date = ''2011-10-10'' 
    ORDER BY 1,2' 
) 
AS ct(
o_location varchar 
,hour_0 varchar 
,hour_1 varchar 
,hour_2 varchar 
,hour_3 varchar 
,hour_4 varchar 
,hour_5 varchar 
,hour_6 varchar 
,hour_7 varchar 
,hour_8 varchar 
,hour_9 varchar 
,hour_10 varchar 
,hour_11 varchar 
,hour_12 varchar 
,hour_13 varchar 
,hour_14 varchar 
,hour_15 varchar 
,hour_16 varchar 
,hour_17 varchar) 

如果你想hour_0首先你必須通過o_hour訂購。我引用manual on crosstab functions

在實踐中,SQL查詢應該總是指定ORDER BY 1,2以保證 的輸入行是否正確排序,也就是與 相同ROW_NAME值的聚集和正確排序在 行內。

+0

排序依據似乎沒有任何效果。 – Yebach

+0

排序似乎沒有任何效果。 我得到 o_location \t hour_0 \t hour_1 \t hour_2 \t hour_3 \t hour_4 \t ...... \t hour_17 .... \t SUB1 \t SUB1 \t SUB1 \t SUB2 \t SUB3 \t' \t SUBX \t subX \t subY \t subY \t''\t'' 當我應該得到不像 o_location \t hour_0 \t \t hour_1 hour_2 \t \t hour_3 hour_4 \t \t hour_5 hour_6 \t \t ...... .... hour_17 11 \t \t \t \t SUB1 SUB1 \t \t SUB1 SUB2 \t \t SUB3 \t \t SUBX SUBX \t \t \t \t subY \t subY \t subY – Yebach

+0

@Yebach:請用適當的格式編輯您的問題。這太難以破譯了。 –