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

MySQL多周期关联多办公点:生成含13个周期的办公点数据

实现每个Office_id对应13个Periode的查询方案

嘿,我来帮你搞定这个需求!你需要让每个office_id都匹配固定的13个periode(周期1到13),同时展示不同nb分组下各周期的对应数值对吧?下面分步骤给你具体的实现方案:

核心思路拆解

  • 首先生成包含1到13的基础周期列表,确保不会漏掉任何一个周期
  • 把你的所有office_id和这个周期列表做交叉连接,得到office_id × periode的全量组合,这样每个office就都能对应13个周期了
  • 最后关联业务数据,用条件聚合把不同nb下的周期数值转成列展示,匹配你想要的输出格式

SQL示例(以PostgreSQL为例)

第一步:生成13个周期的基础表

我们用generate_series快速生成1到13的周期:

WITH periode_list AS (
    SELECT generate_series(1, 13) AS periode
),
-- 第二步:提取所有不重复的office_id(假设你的办公表名为`offices`)
office_list AS (
    SELECT DISTINCT office_id FROM offices
),
-- 第三步:生成所有office和周期的全组合
full_office_periodes AS (
    SELECT ol.office_id, pl.periode
    FROM office_list ol
    CROSS JOIN periode_list pl
)
-- 第四步:关联业务数据并转列展示不同nb的数值
SELECT
    fop.office_id,
    fop.periode,
    -- 生成nb=1下的13个周期数值列
    MAX(CASE WHEN bt.nb = 1 AND bt.periode = 1 THEN bt.value ELSE 0 END) AS "1_1",
    MAX(CASE WHEN bt.nb = 1 AND bt.periode = 2 THEN bt.value ELSE 0 END) AS "1_2",
    MAX(CASE WHEN bt.nb = 1 AND bt.periode = 3 THEN bt.value ELSE 0 END) AS "1_3",
    -- ... 依次写完nb=1的13个周期
    MAX(CASE WHEN bt.nb = 1 AND bt.periode = 13 THEN bt.value ELSE 0 END) AS "1_13",
    -- 接着写nb=2的13个周期
    MAX(CASE WHEN bt.nb = 2 AND bt.periode = 1 THEN bt.value ELSE 0 END) AS "2_1",
    MAX(CASE WHEN bt.nb = 2 AND bt.periode = 2 THEN bt.value ELSE 0 END) AS "2_2",
    -- ... 以此类推直到你需要的所有nb分组
    MAX(CASE WHEN bt.nb = 3 AND bt.periode = 1 THEN bt.value ELSE 0 END) AS "3_1"
FROM full_office_periodes fop
-- 左连接业务表,确保即使某个office+周期没有数据也能保留行
LEFT JOIN your_business_table bt
    ON fop.office_id = bt.office_id
    AND fop.periode = bt.periode
GROUP BY fop.office_id, fop.periode
ORDER BY fop.office_id, fop.periode;

适配其他数据库的调整

如果用的是MySQL或者SQL Server,调整生成周期列表的方式就行:

MySQL 版本(递归CTE生成周期)

WITH RECURSIVE periode_list AS (
    SELECT 1 AS periode
    UNION ALL
    SELECT periode + 1 FROM periode_list WHERE periode < 13
)
-- 后面的逻辑和上面一致

SQL Server 版本(VALUES子句生成周期)

periode_list AS (
    SELECT periode FROM (VALUES (1),(2),(3),(4),(5),(6),(7),(8),(9),(10),(11),(12),(13)) AS t(periode)
)
-- 后面的逻辑和上面一致

重要提示

  • 记得把示例中的offices、your_business_table、value替换成你实际的表名和数值字段名
  • 如果你的业务数据里nb和periode是关联的,CASE语句的条件要准确匹配,确保每个列对应正确的nb+periode组合

内容的提问来源于stack exchange,提问作者Martin

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 11:27:17