簡體   English   中英

帶有交叉表的 Postgres 數據透視表

[英]Postgres pivot table with crosstab

我有一張像下一張一樣的桌子:

+------------+---------+---------+---------+
|    date    | value 1 | value 2 | value 3 |
+------------+---------+---------+---------+
| 01/01/2017 |     263 |       7 |     222 |
| 02/01/2017 |     275 |      -9 |     209 |
| 03/01/2017 |     331 |      -9 |     243 |
| .          |       . |       . |       . |
| .          |       . |       . |       . |
| .          |       . |       . |       . |
+------------+---------+---------+---------+

我想在 postgres 中創建另一個:

+---------+---------------+------------+------------+
|         |    01/01/2017 | 02/01/2017 | 03/01/2017 |
+---------+---------------+------------+------------+
| value 1 |           263 |        275 |        331 |
| value 2 |             7 |         -9 |         -9 |
| value 3 |           222 |        209 |        243 |
+---------+---------------+------------+------------+

但我的問題是我不知道我會有多少個日期,所以我必須使用這樣的東西:

SELECT * FROM crosstab(
  $$ SELECT value1, date  FROM myTable ORDER BY 1 $$,
  $$ SELECT m FROM generate_series((select min(date) from myTable) ,(select max(date) from myTable), '1 month'::interval) m $$
) AS (
  ".." date, ".." date, ".." date, ".." date
);

有人可以幫助我嗎? 謝謝。

您的基本問題是 PostgreSQL 需要知道列是什么樣子才能計划查詢。 因此,您需要返回某種固定列結構。 您可以通過多種方式執行此操作:

  1. 首先查詢日期或允許輸入日期,然后在 db 客戶端中生成您的查詢。
  2. 將其包裝在一個存儲過程中,該過程返回一個 refcursor
  3. 包裝在一個存儲過程中,該過程返回行的 JSON 表示列表。

但是無論哪種方式,如果不在某處動態生成查詢,就無法在查詢中執行此操作。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM