Follow

Keep Up to Date with the Most Important News

By pressing the Subscribe button, you confirm that you have read and are agreeing to our Privacy Policy and Terms of Use
Contact

postgres crosstab return 3 columns, how to add more column

My question is similar to this but the answer didn’t work in my case. Here’s my table.

CREATE TABLE response(session_id int, seconds int, question_id int,
  response varchar(500),file bytea);

INSERT INTO response(session_id, seconds, question_id, response, file)
VALUES 
(652,1459721866,31,0,NULL),(652,1459721866,32,1,NULL),(652,1459721866,33,0,NULL),
(652,1459721866,34,0,NULL),(652,1459721866,35,0,NULL),(652,1459721866,36,0,NULL),
(652,1459721866,37,0,NULL),(652,1459721866,38,0,NULL),(656,1460845066,31,0,NULL),
(656,1460845066,32,0,NULL),(656,1460845066,33,0,NULL),(656,1460845066,34,0,NULL),
(656,1460845066,35,1,NULL),(656,1460845066,36,0,NULL),(656,1460845066,37,0,NULL),
(656,1460845066,38,0,NULL),(657,1463782666,31,0,NULL),(657,1463782666,32,0,NULL),
(657,1463782666,33,0,NULL),(657,1463782666,34,0,NULL),(657,1463782666,35,1,NULL),
(657,1463782666,36,0,NULL),(657,1463782666,37,0,NULL),(657,1463782666,38,0,NULL)

The following query works,

SELECT * FROM
    crosstab ('select session_id, question_id, response 
                from  response
     WHERE to_timestamp(seconds) BETWEEN ''2016-04-01'' AND ''2016-04-30''
                order by session_id,question_id') AS aresult (session_id int,
       --- seconds int,
        not_moving varchar(500),
        foot varchar(500),
        bike varchar(500),
        motor varchar(500),
        car varchar(500),
        bus varchar(500),
        metro varchar(500),
        train varchar(500),
        other varchar(500));

Which gives:

MEDevel.com: Open-source for Healthcare and Education

Collecting and validating open-source software for healthcare, education, enterprise, development, medical imaging, medical records, and digital pathology.

Visit Medevel

session_id  not_moving  foot    bike    motor   car bus metro   train   other
652             0        1       0       0       0   0    0       0      null
656             0        0       0       0       1   0    0       0      null

But I need to return the seconds column as well. This query didn’t work:

SELECT *
FROM  crosstab(
  $$ 
     SELECT session_id, seconds, question_id, response
     FROM response 
     WHERE to_timestamp(seconds) BETWEEN '2016-04-01' AND '2016-04-30'
     ORDER BY session_id, question_id
  $$,
  $$
   VALUES ('seconds')
  $$
  ) AS myresult (session_id int,
         seconds int,
        not_moving varchar(500),
        foot varchar(500),
        bike varchar(500),
        motor varchar(500),
        car varchar(500),
        bus varchar(500),
        metro varchar(500),
        train varchar(500),
        other varchar(500)
  
  )
CROSS JOIN LATERAL age(seconds)

Expected output:

session_id  seconds   not_moving    foot    bike    motor   car bus metro   train   other
   652    1459721866     0           1       0        0      0   0    0       0      null
   656    1460845066     0           0       0        0      1   0    0       0      null

>Solution :

i am unsure what AGE supposed to be, but you can get, as i wrote by joing the sum of seconds

WITH CTE AS
(SELECT * FROM
    crosstab ('select session_id, question_id, response 
                from  response
     WHERE to_timestamp(seconds) BETWEEN ''2016-04-01'' AND ''2016-04-30''
                order by session_id,question_id') AS aresult (session_id int,
       --- seconds int,
        not_moving varchar(500),
        foot varchar(500),
        bike varchar(500),
        motor varchar(500),
        car varchar(500),
        bus varchar(500),
        metro varchar(500),
        train varchar(500),
        other varchar(500))
  )
  SELECT CTE.session_id, seconds, not_moving, foot, bike, motor, car, bus,  metro, train, other
  FROM CTE 
  JOIN ( SELECT session_id,SUM(seconds) as seconds FROM response GROUP BY session_id) sum_sec 
  ON sum_sec.session_id = CTE.session_id
  
  ;
session_id seconds not_moving foot bike motor car bus metro train other
652 11677774928 0 1 0 0 0 0 0 0 null
656 11686760528 0 0 0 0 1 0 0 0 null
SELECT 2

fiddle

Add a comment

Leave a Reply

Keep Up to Date with the Most Important News

By pressing the Subscribe button, you confirm that you have read and are agreeing to our Privacy Policy and Terms of Use

Discover more from Dev solutions

Subscribe now to keep reading and get access to the full archive.

Continue reading