3

次のようなクエリがあります。

select to_date(to_char(registime, 'YYYY-MM'),'YYYY-MM') as dt,count(id) as total_call  
from all_info 
where alarm_id is null
group by dt   
order by dt

そして、結果は次のようになります。

dt          total_call      
2011-03-01     45
2011-04-01     61
2011-05-01     62
2011-06-01     41
2011-07-01     48
2011-08-01     42
2011-09-01     28
2011-10-01     39

以下のデモのような結果、表形式が必要です。

2011-03-01   2011-04-01  2011-05-01  2011-06-01  ..........
   45            61          62          41

crosstabを使いたいのですが、うまくいきませんか?

4

1 に答える 1

3

contrib モジュールtablefuncを調べます。まさにあなたが探している種類のピボット テーブル機能を提供します。マニュアルはこちらをご覧ください。

ここまたは上記のコメントで @Paul Tomblin が提案した記事のインストール手順に従ってください。

次に、関数は次のようになります。

SELECT *
  FROM crosstab($$
SELECT 'total_calls'::text AS col_name
      ,to_char(registime, '"x"YYYY_MM_01') as dt
      ,count(id) as total_call  
FROM   all_info 
WHERE  alarm_id is null
GROUP  BY dt   
ORDER  BY dt
$$)
AS ct(
 call_day text
,x2011_03_01 int8
,x2011_04_01 int8
,x2011_05_01 int8
,x2011_06_01 int8
,x2011_07_01 int8
,x2011_08_01 int8
,x2011_09_01 int8
,x2011_10_01 int8);

出力:

  call_day   | x2011_03_01 | x2011_04_01 | x2011_05_01 | x2011_06_01 | x2011_07_01 | x2011_08_01 | x2011_09_01 | x2011_10_01
-------------+-------------+-------------+-------------+-------------+-------------+-------------+-------------+-------------
 total_calls |           1 |           4 |           4 |           2 |           1 |           5 |           1 |           1

列名は数字で始めることはできません (または二重引用符を付ける必要があります)。そのため、日付の前に x を付けました。また、クエリを簡素化しました。
これをビューまたは関数にラップして、繰り返し使用できます。
おそらく、列名とEXECUTEを動的に調整するplpgsql関数です。

この関連する回答の詳細、説明、およびリンク

于 2011-10-26T15:11:30.827 に答える