从原始表创建新的表结构

时间:2013-12-30 10:02:16

标签: sql postgresql pivot postgresql-9.2

我有一个名为TrainingMatrix的表,定义如下:

CREATE TABLE TrainingMatrix
(
  "ID" text NOT NULL,
  "TrainingName" text NOT NULL,
  "Institute" text,
  "ExpiryDate" date,
  CONSTRAINT "TrainingMatrix_pkey" PRIMARY KEY ("ID", "TrainingName", "ExpiryDate")
)

下表中阐明了一些虚拟数据: enter image description here

可以找到可编辑和可测试的数据here(SQL Fiddle)。

我正在尝试编写可以重新生成表的SQL语句,如下所示: enter image description here

原始表TrainingName中的TrainingMatrix列可以采用任何值,只要添加了Tx这样的新值,第二个目标表必须将此值视为新列下面:

enter image description here

我正在使用PostgreSQL 9.2。

1 个答案:

答案 0 :(得分:1)

感谢小提琴,这是提供测试数据的最佳形式。

我无法在SQLfiddle上演示工作解决方案,因为无法在那里安装其他模块。这可能在将来有效,与Jake Feasel(网站的创建者)的讨论正在进行中是否要安装更多选定的附加模块。

无论如何,这个查询按要求完成工作(在Postgres 9.3上测试):

SELECT * FROM crosstab(
       'SELECT "ID", "TrainingName", "ExpiryDate"
        FROM   trainingmatrix
        ORDER  BY 1,2'

      ,$$VALUES ('T1'::text), ('T2'), ('T3'), ('T4')$$)
AS ct ("Section" text, "T1" text, "T2" text, "T3" text, "T4" text);

您可以在此相关答案中找到详细说明:
PostgreSQL Crosstab Query

对于动态版本,请考虑以下相关答案:
Dynamic alternative to pivot with CASE and GROUP BY

完全动态目前不可能。你需要两个步骤:
1.)构建语句本身(上面链接的第二个答案的代码) 2.)执行它。