【问题标题】:如何只返回一行一列名?
【发布时间】:2022-01-01 03:44:28
【问题描述】:

我正在自学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, no_people
FROM test_sch.apollo_org_job_function 
GROUP BY department, no_people 
ORDER BY department;

我的回报是:

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

调用函数

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

预期输出

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

注意:结果应仅包含名为“dep_people”的 1 列和字符串中的 1 行,(“Engineering:2 , human_resources:4, corporate:1”是单个字符串)

【问题讨论】:

  • 我错过了排除'accounting'的规则...

标签: sql postgresql aggregate-functions


【解决方案1】:
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;

【讨论】:

    【解决方案2】:

    我想,STRING_AGG 可能会对您有所帮助。像这样的:

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

    【讨论】:

    • 谢谢! @slava-rozhnev
    【解决方案3】:

    您可以使用JSON_BUILD_OBJECTJSON_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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-08-10
      • 2014-02-15
      • 2022-06-15
      • 2011-05-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多