You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何从两个SQL表生成指定格式的表格输出?

如何从两个SQL表生成指定格式的表格输出?

嘿,我看你在尝试把job_positions和job_employees这两个表关联起来生成符合需求的表格输出,不过现有代码里有几个小问题导致没得到预期结果,我帮你一步步梳理解决:

首先,你的代码里的直接错误

你写的CTE里用了position和employee作为表名,但实际你的表是job_positions和job_employees,这会直接导致“表不存在”的错误,这是最容易修正的点。

然后,根据你的需求调整逻辑

从你的尝试来看,你想要每个职位一行,展示职位信息,同时处理员工空缺的情况。这里分两种常见需求给你方案:

方案1:每个职位一行,汇总员工列表+空缺统计

如果需要展示每个职位的总名额、已填充数量、空缺数量,以及所有员工的名字,用这个查询:

WITH EmployeeStats AS (
    -- 先统计每个职位的员工数量和名字列表
    SELECT 
        position_id,
        COUNT(*) AS filled_posts,
        STRING_AGG(name, ', ') AS employee_names
    FROM job_employees
    GROUP BY position_id
)
SELECT
    p.title AS 职位名称,
    p.groups AS 组别,
    p.levels AS 等级,
    p.payscale AS 薪资标准,
    p.totalpost AS 总职位数,
    COALESCE(es.filled_posts, 0) AS 已填充职位数,
    (p.totalpost - COALESCE(es.filled_posts, 0)) AS 空缺职位数,
    COALESCE(es.employee_names, 'Vacant') AS 员工姓名
FROM job_positions p
LEFT JOIN EmployeeStats es ON p.id = es.position_id
ORDER BY p.id;

方案2:每个职位的每个名额对应一行,空缺显示Vacant

如果需要把每个职位的所有名额都列出来,不管有没有员工,空缺的名额显示Vacant,用这个查询:

WITH PositionSlots AS (
    -- 生成每个职位的所有名额行(比如总职位数是5,就生成5行)
    SELECT 
        p.id AS position_id,
        p.title,
        p.groups,
        p.levels,
        p.payscale,
        generate_series(1, p.totalpost) AS slot_number
    FROM job_positions p
),
RankedEmployees AS (
    -- 给每个职位的员工按ID排序编号
    SELECT
        position_id,
        name,
        ROW_NUMBER() OVER (PARTITION BY position_id ORDER BY id) AS emp_rank
    FROM job_employees
)
SELECT
    ps.title AS 职位名称,
    ps.groups AS 组别,
    ps.levels AS 等级,
    ps.payscale AS 薪资标准,
    COALESCE(re.name, 'Vacant') AS 员工姓名
FROM PositionSlots ps
LEFT JOIN RankedEmployees re ON ps.position_id = re.position_id AND ps.slot_number = re.emp_rank
ORDER BY ps.position_id, ps.slot_number;

修正你原来的查询(仅展示每个职位的第一个员工)

如果你只是想保留你原来的逻辑,只展示每个职位的第一个员工,那修正表名后的代码是:

WITH RankedEmployees AS (
    SELECT
        p.title AS Title,
        p.groups AS "Group",
        p.levels AS Level,
        p.payscale AS Payscale,
        e.name AS Employee_Name,
        ROW_NUMBER() OVER (PARTITION BY p.id ORDER BY e.id) AS emp_rank
    FROM job_positions p
    LEFT JOIN job_employees e ON p.id = e.position_id
)
SELECT
    Title,
    "Group",
    Level,
    Payscale,
    COALESCE(MAX(CASE WHEN emp_rank = 1 THEN Employee_Name END), 'Vacant') AS Employee_Name
FROM RankedEmployees
GROUP BY Title, "Group", Level, Payscale
ORDER BY Title, "Group", Level, Payscale;

总结

先修正表名的错误,再根据你实际想要的输出格式选择对应的方案就可以啦~

备注:内容来源于stack exchange,提问作者Sam

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.21 12:13:04