【问题标题】:Why does my Postgres crosstab produce the error: 'Query-specified return tuple has 7 columns but crosstab returns 6'?为什么我的 Postgres 交叉表会产生错误:“查询指定的返回元组有 7 列,但交叉表返回 6”?
【发布时间】: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


【解决方案1】:

您的问题是box_well_run_date 在您的结果集中找不到。

试试这个:

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, 
 HTTLPR text, 
 Amelo text,
 Caspi text,
 DAT1 text,
 DRD4 text);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-10-27
    • 1970-01-01
    • 2020-07-09
    • 1970-01-01
    • 1970-01-01
    • 2019-07-25
    • 1970-01-01
    相关资源
    最近更新 更多