我有一个名为TrainingMatrix
的表,定义如下:
CREATE TABLE TrainingMatrix
(
"ID" text NOT NULL,
"TrainingName" text NOT NULL,
"Institute" text,
"ExpiryDate" date,
CONSTRAINT "TrainingMatrix_pkey" PRIMARY KEY ("ID", "TrainingName", "ExpiryDate")
)
下表中阐明了一些虚拟数据:
可以找到可编辑和可测试的数据here(SQL Fiddle)。
我正在尝试编写可以重新生成表的SQL语句,如下所示:
原始表TrainingName
中的TrainingMatrix
列可以采用任何值,只要添加了Tx
这样的新值,第二个目标表必须将此值视为新列下面:
我正在使用PostgreSQL 9.2。
答案 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.)执行它。