2012-06-17 1 views
3

내 쿼리는 다음과 같습니다 : 쿼리가이 연결 문자열을 테스트 테이블에 대해 테스트 할 수포스트 그레스 : 항상에서 작성 버킷 크로스 탭 쿼리에 남아

SELECT mthreport.* 
FROM crosstab 
('SELECT 
to_char(ipstimestamp, ''mon DD HH24h'') As row_name, 
varid::text || log.varid || ''_'' || ips.objectname::text As bucket, 
COUNT(*)::integer As bucketvalue 
FROM loggingdb_ips_boolean As log 
INNER JOIN IpsObjects As ips 
ON log.Varid=ips.ObjectId 
WHERE ((log.varid = 37551) 
OR (log.varid = 27087) 
OR (log.varid = 50876) 
OR (log.varid = 45096) 
OR (log.varid = 54708) 
OR (log.varid = 47475) 
OR (log.varid = 54606) 
OR (log.varid = 25528) 
OR (log.varid = 54729)) 
GROUP BY to_char(ipstimestamp, ''yyyy MM DD HH24h''), row_name, objectid, bucket   
ORDER BY to_char(ipstimestamp, ''yyyy MM DD HH24h''), row_name, objectid, bucket') 

As mthreport(item_name text, varid_37551 integer, 
      varid_27087 integer , 
      varid_50876 integer , 
      varid_45096 integer , 
      varid_54708 integer , 
      varid_47475 integer , 
      varid_54606 integer , 
      varid_25528 integer , 
      varid_54729 integer , 
      varid_29469 integer) 

: "호스트 = bellariastrasse.com 포트 = 5432 dbname = IpsLogging user = guest password = guest "

쿼리의 구문이 정확하고 정상적으로 실행됩니다. 내 문제는 COUNT (*) 값이 항상 맨 왼쪽 열을 채우는 것입니다. 그러나 대부분의 경우 왼쪽 열에는 0 또는 NULL이 있어야하며 두 번째 (또는 n 번째) 열만 채워야합니다. 내 뇌가 녹아서 무엇이 잘못되었는지를 알 수 없습니다!

+1

나는 psql에 연결하고 pg_hba.conf 유효성 검증 실패를 얻으려고합니다. – kgrittn

+0

죄송합니다 - 죄송합니다. 나는 손님 계정을 서둘러 설정했고 뭔가를 엉망으로 만들었을지도 모릅니다. 나는 오늘 거기에서 무엇이 잘못되었는지를 점검 할 것이다. – aag

+0

이제 연결이 수정되어야합니다. 다시해볼 수 있니? – aag

답변

2

crosstab() 변종 두 개의 매개 변수을 사용하는 것이 해결책입니다.

두 번째 매개 변수 (다른 쿼리 문자열)는 출력 열 목록을 생성하므로 데이터 쿼리 (첫 번째 매개 변수)의 NULL 값이 올바르게 할당됩니다.

확인하고 특정 crosstab(text, text)에서 manual for the tablefunc extension :

교차의 단일 파라미터 형태의 주요 한계는 가 처음으로 각각의 값을 삽입 모두 그룹의 모든 값을 처리 이다 이용 가능한 열. 값 열이 특정 데이터 범주에 해당하고 일부 그룹에 일부 데이터가 없으면 제대로 작동하지 않을 수 있습니다. 크로스 탭의 두 매개 변수 형식은 출력 열에 해당하는 범주의 명시적인 목록 을 제공하여이 경우를 처리합니다.

강조 광산. 나는 최근에 몇 가지 관련 답변을 here 또는 here 또는 here으로 게시했습니다.

+0

감사합니다. Erwin, kiss-de-hoand gnä'herr (= '대단한 남자', 느슨하게 번역 됨)! 나는 2 매개 변수 쿼리를 시도하고 다시보고해야한다! – aag

+0

빙고 - 저는 Erwin의 지시에 따라 두 번째 쿼리를 설정했습니다. 이제는 일이 매력처럼 작동합니다! 다음으로 카테고리 필드를 제공하는 함수를 사용해 보겠습니다. FUNCTION 방식은 카테고리가 선험적으로 알려지지 않은 "동적"크로스 탭 생성을 가능하게하는 훌륭한 해결 방법입니다. 내가 맞습니까? – aag

+1

@aag : "Küss die Hand gnä 'Frau!" 올드 스쿨 비엔나 인사말이 되겠지만, 실제로는 여성을 겨냥했다. 공공연한 동성애자들끼리 손을 키스하는 것은 옛 오스트리아 제국에서 유행하지 않았다. : D –