1

PostgreSQL에서 크로스 탭을 만드는 방법은 무엇입니까? 모든 것이 작동하는지

INSERT INTO pivot(zoom, day, point) VALUES(6,'2015-10-01',21); 
INSERT INTO pivot(zoom, day, point) VALUES(7,'2015-10-01',43); 
INSERT INTO pivot(zoom, day, point) VALUES(8,'2015-10-01',18); 
INSERT INTO pivot(zoom, day, point) VALUES(9,'2015-10-01',14); 
INSERT INTO pivot(zoom, day, point) VALUES(10,'2015-10-01',23); 
INSERT INTO pivot(zoom, day, point) VALUES(11,'2015-10-01',54); 
INSERT INTO pivot(zoom, day, point) VALUES(6,'2015-10-02',657); 
INSERT INTO pivot(zoom, day, point) VALUES(7,'2015-10-02',432); 
INSERT INTO pivot(zoom, day, point) VALUES(8,'2015-10-02',421); 
INSERT INTO pivot(zoom, day, point) VALUES(9,'2015-10-02',432); 
INSERT INTO pivot(zoom, day, point) VALUES(10,'2015-10-02',454); 
INSERT INTO pivot(zoom, day, point) VALUES(11,'2015-10-02',654); 

볼 수 있습니다 TEMPORARY TABLE에게 ​​

CREATE TEMP TABLE pivot(
gid SERIAL, 
zoom smallint NOT NULL, 
day timestamp with time zone NOT NULL, 
point integer NOT NULL 
); 

INSERT 데이터를 작성 지금까지 :

SELECT zoom, day, point 
FROM pivot 
ORDER BY 1,2; 

결과 :

zoom |   day   | point 
------+------------------------+------- 
    6 | 2015-10-01 00:00:00+02 | 21 
    6 | 2015-10-02 00:00:00+02 | 657 
    7 | 2015-10-01 00:00:00+02 | 43 
    7 | 2015-10-02 00:00:00+02 | 432 
    8 | 2015-10-01 00:00:00+02 | 18 
    8 | 2015-10-02 00:00:00+02 | 421 
    9 | 2015-10-01 00:00:00+02 | 14 
    9 | 2015-10-02 00:00:00+02 | 432 
    10 | 2015-10-01 00:00:00+02 | 23 
    10 | 2015-10-02 00:00:00+02 | 454 
    11 | 2015-10-01 00:00:00+02 | 54 
    11 | 2015-10-02 00:00:00+02 | 654 
(12 rows) 

C REATE EXTENSION :

SELECT * FROM crosstab(
     'SELECT zoom, day, point 
     FROM pivot 
     ORDER BY 1,2' 
     ,$$VALUES ('2015-10-01'::timestamp), ('2015-10-02')$$) 
AS ct ("zoom" smallint, "2015-10-01" integer, "2015-10-02" integer); 

결과

CREATE EXTENSION tablefunc; 

크로스 탭 쿼리 : 나는 점의 값을 반환 할 수 없습니다

zoom | 2015-10-01 | 2015-10-02 
------+------------+------------ 
    6 |   | 
    7 |   | 
    8 |   | 
    9 |   | 
    10 |   | 
    11 |   | 
(6 rows) 

는 쿼리 자체가 나에게 빈 지점을 제공합니다. 내가 도대체 ​​뭘 잘못하고있는 겁니까?

편집 나는 그것을 다른 방법을 시도,하지만, 난 여전히 위의 질문에 대한 답을 찾고 있어요.

SELECT * from crosstab (
    'select zoom, day, point 
    from pivot 
    order by 1,2', 
    'select distinct day from pivot order by 1') 
AS ct(zoom smallint, "2015-10-01" integer, "2015-10-02" integer); 

결과 : @Abelisto 제안에

zoom | 2015-10-01 | 2015-10-02 
------+------------+------------ 
    6 |   21 |  657 
    7 |   43 |  432 
    8 |   18 |  421 
    9 |   14 |  432 
    10 |   23 |  454 
    11 |   54 |  654 
(6 rows) 
+2

시간 zone'과와의 일 타임 스탬프'테이블의 유형 일치 확인 질의''2015-10-01 ':: timestamp' (잘못,''2015-10-01':: timestamptz'이어야합니다) – Abelisto

답변

2

덕분에 대해 timestamptz이 작동 :

SELECT * FROM crosstab(
     'SELECT zoom, day, point 
     FROM pivot 
     ORDER BY 1,2' 
     ,$$VALUES ('2015-10-01'::timestamptz), ('2015-10-02')$$) 
AS ct ("zoom" smallint, "2015-10-01" integer, "2015-10-02" integer);