Как вернуть только одну строку и одно имя столбца?

Я сам изучаю функцию Psql и хочу вернуть только одну строку и одно имя столбца: dep_people, и не знаю, как решить этот вопрос в одной строке и одном имени столбца. Пожалуйста, помогите мне понять функцию Psql.

Таблица предварительного просмотра

      SELECT * FROM test_sch.apollo_org_job_function;

|-------------------------------------------|
|organization_id |department      |no_people|
|-------------------------------------------|
|      2a        |accounting      |   3     | 
|      1a        |engineering     |   2     |
|      1a        |entrepreneurship|   1     | 
|      1a        |human resources |   4     |
|-------------------------------------------|

Я здесь

      SELECT department, COUNT(*) as "no_people"
FROM test_sch.apollo_org_job_function GROUP BY department ORDER BY department;

Мое возвращение:

      |--------------------------|
|department      |no_people|
|--------------------------|
|accounting      |  3      | 
|engineering     |  2      |
|entrepreneurship|  1      | 
|human resources |  4      |
|--------------------------| 

Я хочу этот результат

      Calling the function:-

select * from test_sch.return_dep_people('1a')
as f(dep_people text);

Expected output:-
------------------------------------------------------|
|dep_people                                           |
------------------------------------------------------|
|Engineering:2 , human_resources:4, entrepreneurship:1| 
-------------------------------------------------------

ПРИМЕЧАНИЕ: результат должен содержать только 1 столбец с именем «dep_people» и только 1 строку в строке («Engineering: 2, human_resources:4, enterprises: 1» - это одна строка)

3 ответа

Думаю, STRING_AGG может вам помочь. Что-то вроде этого:

      SELECT
  STRING_AGG(d.department || ': ' || CAST(d.no_people AS text), ', ') AS dep_people 
FROM ([your initial query]) AS d

Вы можете добиться этого, используя JSON_BUILD_OBJECTа также JSON_AGG:

      WITH data AS (
  SELECT department, COUNT(*) as "no_people"
  FROM apollo_org_job_function GROUP BY department ORDER BY department
) SELECT 
    JSON_AGG(JSON_BUILD_OBJECT(department, no_people)) as "dep_people"
FROM data;

PostgreSQL JSON_AGG JSON_BUILD_OBJECT

      create function happy_return_dep_people(organisation_id text)
returns text
language plpgsql
as
$$
declare
   dep_people text;
begin
      SELECT STRING_AGG(d.department || ': ' || CAST(d.no_people AS text), ', ') into dep_people AS dep_people 
      FROM (
        SELECT department, no_people
      FROM test_sch.apollo_org_job_function
      WHERE organization_id = organisation_id
      GROUP BY department, no_people ORDER BY department) AS d;
   
   return dep_people;
end;
$$;
      select * from test_sch.happy_return_dep_people('1a') 
as dep_people;
Другие вопросы по тегам