Это:
select array_agg(row(order_id,order_date,order_desc))
from (
select 1 order_id,1 customer_id,'2010-01-01' order_date,'Tom''s First' order_desc union
select 2 order_id,1 customer_id,'2010-04-01' order_date,'Tom''s Second' order_desc union
select 7 order_id,1 customer_id,'2010-04-13' order_date,'Tom''s Third' order_desc union
select 8 order_id,1 customer_id,'2011-04-13' order_date,'Tom''s Last' order_desc union
select 5 order_id,1 customer_id,'2011-06-20' order_date,'Tom''s Really Last.' order_desc union
select 3 order_id,2 customer_id,'2010-07-07' order_date,'Dick''s First' order_desc union
select 6 order_id,2 customer_id,'2011-07-07' order_date,'Dick''s Other' order_desc union
select 4 order_id,3 customer_id,'2011-04-04' order_date,'Harry''s Only' order_desc
) orders
group by orders.customer_id
дает вам три строки:
"{"(2,2010-04-01,\"Tom's Second\")","(1,2010-01-01,\"Tom's First\")","(7,2010-04-13,\"Tom's Third\")","(5,2011-06-20,\"Tom's Really Last.\")","(8,2011-04-13,\"Tom's Last\")"}"
"{"(3,2010-07-07,\"Dick's First\")","(6,2011-07-07,\"Dick's Other\")"}"
"{"(4,2011-04-04,\"Harry's Only\")"}"
Это выглядит очень близко к тому, что вы сказали бы "еще лучше":
клиент | order_id1 | order_date1 | order_desc1 | order_id2 | order_date2 | order_desc2 |...
Единственное отличие: все содержится в одном столбце.Конечно, этот единственный столбец является массивом, а каждый элемент является составным типом, и если вы сгладите эту структуру, вы получите именно то, что просили.Если конечно, это зависит от того, есть ли у вас средства для выравнивания.