1

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ます。
これは、すべての場所のすべてのコースに適用されます。それらはすべて左揃えです。

どこが間違っているのですか?

4

1 に答える 1

1

サンプルデータがないので、推測でしかありません。これが私を襲うものです:あなたのクロス集計機能に
はありません。ORDER BY私は1つ追加しました:

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クロス集計関数のマニュアルを引用します:

実際には、SQL クエリは常に ORDER BY 1,2 を指定して、入力行が適切に並べられるようにする必要があります。つまり、同じ row_name を持つ値がまとめられ、行内で正しく並べ替えられます。

于 2011-10-11T08:10:39.710 に答える