【发布时间】:2012-01-29 13:41:34
【问题描述】:
我正在使用 Postgres 8.4.9,但无法让他们的交叉表正常工作。
我的数据如下所示:
rowname | bucket | bucket_value
----------------+---------------------+--------------
CL100001 10011 | 1 A01 | 01/01/2001 | 14 16
CL100001 10011 | 1 A01 | 01/01/2001 |
CL100001 10011 | 1 A01 | 01/01/2001 |
CL100001 10011 | 1 A01 | 01/01/2001 | 440 480
CL100001 10011 | 1 A01 | 01/01/2001 | 475 475
CL100002 10021 | 1 B01 | 01/01/2001 | 16 16
CL100002 10021 | 1 B01 | 01/01/2001 |
CL100002 10021 | 1 B01 | 01/01/2001 |
CL100002 10021 | 1 B01 | 01/01/2001 | 440 480
CL100002 10021 | 1 B01 | 01/01/2001 | 475 475
CL100003 10030 | 1 C01 | 01/01/2001 | 14 16
CL100003 10030 | 1 C01 | 01/01/2001 |
CL100003 10030 | 1 C01 | 01/01/2001 |
CL100003 10030 | 1 C01 | 01/01/2001 | 440 440
CL100003 10030 | 1 C01 | 01/01/2001 | 475 475
...
这是从用于准备数据的表 ct 中选择的。
接下来,我的查询看起来像
SELECT gtreport.* FROM crosstab('SELECT
rowname,
bucket,
bucket_value
FROM
ct
ORDER BY
rowname, bucket',
'SELECT DISTINCT
markername
FROM
markers M,
genotypes G,
gsamples S,
guploads U
WHERE
M.markerid=G.markers_id
AND G.gsamples_id=S.id
AND S.guploads_id=U.id
AND ( U.ibg_study_id=15 AND U.ibg_project_id is NULL)
ORDER BY
M.markername')
AS gtreport(
labid text,
box_well_run_date text,
HTTLPR text,
Amelo text,
Caspi text,
DAT1 text,
DRD4 text)
我尽我所能按照 Postgres 文档进行构建。 但这会产生错误 “查询指定的返回元组有 7 列,但交叉表返回 6。”
这令人费解。如果有人看到我做错了什么,将不胜感激......
--瑞克
【问题讨论】:
-
您的第二个查询 (
select distinct markername ...) 产生了多少行? -
需要为我们澄清第二个查询中返回的内容...您提供了 ct 的组成而不是标记。您是否期望从第二个查询中返回 2 个不同的值并且只有 2 个不同的值?我对交叉表的偏好是创建一个选择语句,将 ID 字段连接到您想要的 7 列中的每一列(为每个 ID 创建 7 行以填充交叉表报告),然后将其连接到其他表以填充值为需要。
-
道歉;这是第二个查询返回的内容:markername ------------ 5HTTLPR Amelo Caspi DAT1 DRD4 (5 rows)
-
你好@Twelfth,抱歉;这是第二个查询返回的内容: markername ------------ 5HTTLPR Amelo Caspi DAT1 DRD4 (5 rows) 这些是 AS gtreport 子句中指定的 5 个列标题。不确定我是否理解如何构建您建议的答案......但这听起来像我需要的......谢谢,rixter
-
您能否将其添加到答案中,以便我对其进行投票并将其从未回答的问题列表中删除?
标签: postgresql crosstab