我在postgres中使用交叉表函数。基本的SQL是:
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中。
这适用于所有地点的所有课程。它们都左对齐。
我哪里做错了?
发布于 2011-10-11 16:10:40
由于没有样本数据,我只能猜测。下面是给我留下深刻印象的:
交叉表函数中没有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的值被组合在一起并在行中正确排序。
https://stackoverflow.com/questions/7722824
复制相似问题