Почему моя кросс-таблица Postgres выдает ошибку: «Заданный запросом возвращаемый кортеж имеет 7 столбцов, но кросс-таблица возвращает 6»?

Я использую 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».

Что сбивает с толку. Если кто увидит, что я сделал не так, буду очень признателен....

--Рик


person rixter    schedule 29.12.2011    source источник
comment
Сколько строк выдает ваш второй запрос (select distinct markername ...)?   -  person mu is too short    schedule 29.12.2011
comment
нужно уточнить, что возвращается во втором запросе для нас... вы даете состав ct, но не маркеры. Вы ожидаете, что из второго запроса вернутся 2 разных значения и только 2 разных значения? Я предпочитаю кросс-таблицы, чтобы создать оператор выбора, который соединяет поле идентификатора с каждым из 7 нужных столбцов (создает 7 строк для каждого идентификатора для заполнения отчета кросс-таблицы), а затем присоединяет его к другим вашим таблицам, чтобы заполнить значения как нужный.   -  person Twelfth    schedule 29.12.2011
comment
Извинения; вот что возвращает второй запрос: markername ------------ 5HTTLPR Amelo Caspi DAT1 DRD4 (5 строк)   -  person rixter    schedule 30.12.2011
comment
Здравствуйте @Twelfth, извините; вот что возвращает второй запрос: markername ------------ 5HTTLPR Amelo Caspi DAT1 DRD4 (5 строк) Это 5 заголовков столбцов, указанных в предложении AS gtreport. Не уверен, что понимаю, как построить предложенный вами ответ... но это похоже на то, что мне нужно... спасибо, рикстер   -  person rixter    schedule 30.12.2011
comment
Здравствуйте @mu, Извините; вот что возвращает второй запрос: markername ------------ 5HTTLPR Amelo Caspi DAT1 DRD4 (5 строк) Это 5 заголовков столбцов, указанных в предложении AS gtreport. Любые предложения приветствуются... спасибо, rixter   -  person rixter    schedule 30.12.2011
comment
Привет всем: неважно! Я понял это. Так просто, когда знаешь как! «Имя_строки» просто должно было включать все, что повторяется, «ведро» должно было содержать заголовки столбцов данных, а «значение_бакета» должно было содержать только данные. Очень просто, мой дорогой Ватсон...(!)   -  person rixter    schedule 31.12.2011
comment
не могли бы вы добавить это к ответам, чтобы я мог проголосовать за это и удалить это из списка вопросов без ответов?   -  person Chris Travers    schedule 24.03.2013


Ответы (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);
person Chris Travers    schedule 27.03.2013