'PostgreSQL Function - Return a single row from multiple queries

I would like to write a Postgres function which takes various stats from other tables and combines the results into a single row.

e.g.

select count(*) as acount from tableA
select count(*) as bcount from tableB
select count(*) as ccount from tableC

returning

acount, bcount, ccount   as a single record

Obviously the "count" functions listed above are a lot more complex than that, and may even be different amounts of counts for each table.

So ideally is it possible to store them as variables and then build a record from the variables ?



Solution 1:[1]

You can use cross join

select * from
(select count(*) as acount from tableA) as a
,(select count(*) as bcount from tableB) as b
,(select count(*) as ccount from tableC) as c

Solution 2:[2]

No need for variables, you can just combine everything into one select statement with subqueries:

select
(select count(*) from tableA) as acount,
(select count(*) from tableB) as bcount,
(select count(*)  from tableC) as ccount;

Solution 3:[3]

You can also create a new type that consist of 3 bigint type.

CREATE TYPE mutli_count AS (
    _countt1 bigINT,
    _countt2 bigint,
    _countt3 bigINT
);

select( 
    (select count(*) from country),
    (select count(*) from states),
    (select count(*) from cities))::mutli_count;

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1 RF1991
Solution 2 Zakaria
Solution 3 Mark