SQL自定义聚合需求:合并指定Area数据并生成新表
自定义区域聚合的SQL实现方案
嘿,针对你需要将industry表中的区域进行合并聚合,最终生成新表industry2的需求,我整理了一套实用的SQL实现方案,咱们直接来看具体内容:
完整SQL代码
-- 先创建目标表industry2 CREATE TABLE industry2 ( year char(4), qtr char(2), area char(6), industry char(3), ownership char(2), employment numeric(8,0) ); -- 将聚合后的数据插入到industry2中 INSERT INTO industry2 (year, qtr, area, industry, ownership, employment) SELECT year, qtr, -- 用CASE语句完成区域编码的重新归类 CASE -- 把01到17的所有区域统一映射为00 WHEN area BETWEEN '01' AND '17' THEN '00' -- 把20、21这两个区域合并为99 WHEN area IN ('20', '21') THEN '99' -- 如果你有其他不需要合并的区域,取消下面注释就能保留原编码 -- ELSE area END AS area, industry, ownership, -- 按分组字段对就业人数求和 SUM(employment) AS employment FROM dbo.industry -- 可选:如果只想处理指定的两组区域,加上这个WHERE条件过滤 -- WHERE area BETWEEN '01' AND '17' OR area IN ('20', '21') GROUP BY year, qtr, -- GROUP BY的逻辑要和SELECT里的区域映射完全一致 CASE WHEN area BETWEEN '01' AND '17' THEN '00' WHEN area IN ('20', '21') THEN '99' -- ELSE area END, industry, ownership;
关键细节说明
- 区域映射逻辑:用
BETWEEN '01' AND '17'比逐个写OR要简洁高效得多,能一次性覆盖01到17的所有区域;20和21则用IN来匹配。 - 分组一致性:
GROUP BY子句里的区域判断必须和SELECT里的完全相同,这样才能保证同组的记录被正确合并求和。 - 灵活调整空间:如果存在不需要合并的其他区域,取消
ELSE area的注释就能保留原区域编码并单独聚合;如果只需要处理指定的两组区域,加上WHERE条件可以过滤掉无关数据,提升执行效率。
验证结果
用你提供的示例数据执行这段SQL后,会得到和你预期完全一致的结果:
2017 01 00 123000 1 660 2017 01 00 134000 1 26 2017 01 00 144000 1 14 2017 01 99 134000 1 15
内容的提问来源于stack exchange,提问作者Calflamesfann
相关产品推荐
相关产品推荐

