0

I'm trying to convert rows into columns but without success.

I've tried to use a pivot function, but it seems not to be possible because of my values is in time format, not numeric.

I have a table looking like this (including about 25 more columns except from these 3 and hundrede thousands of rows):

Order_ID Order_Event Timestamp
12345 Order_Created 2023-07-08T07:59
12345 Order_delivered 2023-07-09T10:09
12345 Order_planned_delivery 2023-07-08T10:00
67890 Order_Created 2023-07-10T11:40
67890 Order_delivered 2023-07-09T10:09
67890 Order_planned_delivery 2023-07-08T20:30
10111 Order_Created 2023-06-03T20:51
10111 Order_delivered 2023-07-12T18:26
10111 Order_planned_delivery 2023-07-12T18:30

And what I want is something like this with order_event as column names:

Order_ID Order_created Order_delivered Order_planned_delivery
12345 2023-07-08T07:59 2023-07-09T10:09 2023-07-08T10:00
67980 2023-07-10T11:40 2023-07-09T10:09 2023-07-08T20:30
10111 2023-06-03T20:51 2023-07-12T18:26 2023-07-12T18:30

I tried this code as you can see below, and the result gives me the maximum value of the time (from the timestamp, will do the same with dates too) that the order is created, delivered and planned delivery, and it seems to bee right so long, but it just one row in the result:

SELECT

  max(case when Order_Event = "Order_created" then FORMAT_TIMESTAMP ('%R',Timestamp) end)Order_Created,
  max(case when Order_Event = "Order_delivered" then FORMAT_TIMESTAMP ('%R',Timestamp) end) Order_Delivered,
  max(case when Order_Event = "Order_planned_delivery" then FORMAT_TIMESTAMP ('%R',Timestamp) end) Order_Planned_Delivery,

FROM my_sweet_table

limit 100

What I don't solve, is to get the same result above for each single order ID.

If I do like this, I get an error message saying "SELECT list expression references column Order_ID which is neither grouped nor aggregated at [2:1]"

SELECT

Order_ID, 

  max(case when Order_Event = "Order_created" then FORMAT_TIMESTAMP ('%R',Timestamp) end)Order_Created,
  max(case when Order_Event = "Order_delivered" then FORMAT_TIMESTAMP ('%R',Timestamp) end) Order_Delivered,
  max(case when Order_Event = "Order_planned_delivery" then FORMAT_TIMESTAMP ('%R',Timestamp) end) Order_Planned_Delivery,

FROM my_sweet_table

limit 100

This is i similar task but it doesn't helped me: Transpose rows into columns in BigQuery using standard sql

M535i
  • 3
  • 2

1 Answers1

0

The answer is in the error message! You need a group by!

SELECT

Order_ID, 

  max(case when Order_Event = "Order_created" then FORMAT_TIMESTAMP ('%R',Timestamp) end)Order_Created,
  max(case when Order_Event = "Order_delivered" then FORMAT_TIMESTAMP ('%R',Timestamp) end) Order_Delivered,
  max(case when Order_Event = "Order_planned_delivery" then FORMAT_TIMESTAMP ('%R',Timestamp) end) Order_Planned_Delivery,

FROM my_sweet_table
order by Order_ID
limit 100
guillaume blaquiere
  • 66,369
  • 2
  • 47
  • 76