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
相关产品推荐
相关产品推荐

