sql解决取多个截至每个月的数据

问题:需要查询1月、1-2月、1-3月... 1-12月,分区间的累计数据,在同一个sql语句里面实现。

多个分开查询效率不高,并且数据手动合并麻烦。

sql 复制代码
with t1 as (
SELECT *,CASE WHEN insutype= '390' THEN '居民'  ELSE '职工' END 人员类别,SUBSTR(enddate,6,2)  月份 FROM sw_sx_20230821test_1_join_two_all_2 
     WHERE MED_TYPE IN ("21","210104","2403","28","52","71","9938","9940","140201") AND setl_type NOT in ("3")   
     -- 未退费
     and REFD_SETL_FLAG =0 
     -- 有效
     and VALI_FLAG = 1 and SUBSTR(enddate,1,4)='2022' and insutype in ('310','340','390') 
     
     ) 
,
t2 as (
    SELECT certno,人员类别,sum(fulamt_ownpay_amt)+sum(overlmt_selfpay) 自费,FLOOR((sum(fulamt_ownpay_amt)+sum(overlmt_selfpay))/1000) AS 人头自费费用分组
    FROM t1
    WHERE 
    月份<=1
    and 2022年度参保='1'

     GROUP by  certno,人员类别 
)
,
t3 as (
    SELECT certno,人员类别,sum(fulamt_ownpay_amt)+sum(overlmt_selfpay) 自费,FLOOR((sum(fulamt_ownpay_amt)+sum(overlmt_selfpay))/1000) AS 人头自费费用分组
    FROM t1
    WHERE 
    月份<=2
    and 2022年度参保='1'

     GROUP by  certno,人员类别 
),
t4 as (
    SELECT certno,人员类别,sum(fulamt_ownpay_amt)+sum(overlmt_selfpay) 自费,FLOOR((sum(fulamt_ownpay_amt)+sum(overlmt_selfpay))/1000) AS 人头自费费用分组
    FROM t1
    WHERE 
    月份<=3
    and 2022年度参保='1'

     GROUP by  certno,人员类别 
),
t5 as (
    SELECT certno,人员类别,sum(fulamt_ownpay_amt)+sum(overlmt_selfpay) 自费,FLOOR((sum(fulamt_ownpay_amt)+sum(overlmt_selfpay))/1000) AS 人头自费费用分组
    FROM t1
    WHERE 
    月份<=4
    and 2022年度参保='1'

     GROUP by  certno,人员类别 
),
t6 as (
    SELECT certno,人员类别,sum(fulamt_ownpay_amt)+sum(overlmt_selfpay) 自费,FLOOR((sum(fulamt_ownpay_amt)+sum(overlmt_selfpay))/1000) AS 人头自费费用分组
    FROM t1
    WHERE 
    月份<=5
    and 2022年度参保='1'

     GROUP by  certno,人员类别 
),
t7 as (
    SELECT certno,人员类别,sum(fulamt_ownpay_amt)+sum(overlmt_selfpay) 自费,FLOOR((sum(fulamt_ownpay_amt)+sum(overlmt_selfpay))/1000) AS 人头自费费用分组
    FROM t1
    WHERE 
    月份<=6
    and 2022年度参保='1'

     GROUP by  certno,人员类别 
),
t8 as (
    SELECT certno,人员类别,sum(fulamt_ownpay_amt)+sum(overlmt_selfpay) 自费,FLOOR((sum(fulamt_ownpay_amt)+sum(overlmt_selfpay))/1000) AS 人头自费费用分组
    FROM t1
    WHERE 
    月份<=7
    and 2022年度参保='1'

     GROUP by  certno,人员类别 
),
t9 as (
    SELECT certno,人员类别,sum(fulamt_ownpay_amt)+sum(overlmt_selfpay) 自费,FLOOR((sum(fulamt_ownpay_amt)+sum(overlmt_selfpay))/1000) AS 人头自费费用分组
    FROM t1
    WHERE 
    月份<=8
    and 2022年度参保='1'

     GROUP by  certno,人员类别 
),
t10 as (
    SELECT certno,人员类别,sum(fulamt_ownpay_amt)+sum(overlmt_selfpay) 自费,FLOOR((sum(fulamt_ownpay_amt)+sum(overlmt_selfpay))/1000) AS 人头自费费用分组
    FROM t1
    WHERE 
    月份<=9
    and 2022年度参保='1'

     GROUP by  certno,人员类别 
),
t11 as (
    SELECT certno,人员类别,sum(fulamt_ownpay_amt)+sum(overlmt_selfpay) 自费,FLOOR((sum(fulamt_ownpay_amt)+sum(overlmt_selfpay))/1000) AS 人头自费费用分组
    FROM t1
    WHERE 
    月份<=10
    and 2022年度参保='1'

     GROUP by  certno,人员类别 
),
t12 as (
    SELECT certno,人员类别,sum(fulamt_ownpay_amt)+sum(overlmt_selfpay) 自费,FLOOR((sum(fulamt_ownpay_amt)+sum(overlmt_selfpay))/1000) AS 人头自费费用分组
    FROM t1
    WHERE 
    月份<=11
    and 2022年度参保='1'

     GROUP by  certno,人员类别 
),
t13 as (
    SELECT certno,人员类别,sum(fulamt_ownpay_amt)+sum(overlmt_selfpay) 自费,FLOOR((sum(fulamt_ownpay_amt)+sum(overlmt_selfpay))/1000) AS 人头自费费用分组
    FROM t1
    WHERE 
    月份<=12
    and 2022年度参保='1'

     GROUP by  certno,人员类别 
)
--SELECT 人员类别, 人头自费费用分组,sum(自费) 自费,COUNT(certno) 人数,1 截至月份 FROM t2 GROUP by  人员类别,人头自费费用分组 
,
t14 as (
SELECT 人员类别, 人头自费费用分组,sum(自费) 自费,COUNT(certno) 人数,1 截至月份 FROM t2 GROUP by  人员类别,人头自费费用分组 
UNION  ALL
 SELECT 人员类别, 人头自费费用分组,sum(自费) 自费,COUNT(certno) 人数,2 截至月份 FROM t3 GROUP by  人员类别,人头自费费用分组 
UNION  ALL
 SELECT 人员类别, 人头自费费用分组,sum(自费) 自费,COUNT(certno) 人数,3 截至月份 FROM t4 GROUP by  人员类别,人头自费费用分组  
UNION  ALL
 SELECT 人员类别, 人头自费费用分组,sum(自费) 自费,COUNT(certno) 人数,4 截至月份 FROM t5 GROUP by  人员类别,人头自费费用分组 
UNION  ALL
 SELECT 人员类别, 人头自费费用分组,sum(自费) 自费,COUNT(certno) 人数,5 截至月份 FROM t6 GROUP by  人员类别,人头自费费用分组  
UNION  ALL
 SELECT 人员类别, 人头自费费用分组,sum(自费) 自费,COUNT(certno) 人数,6 截至月份 FROM t7 GROUP by  人员类别,人头自费费用分组 
UNION  ALL
 SELECT 人员类别, 人头自费费用分组,sum(自费) 自费,COUNT(certno) 人数,7 截至月份 FROM t8 GROUP by  人员类别,人头自费费用分组  
UNION  ALL
 SELECT 人员类别, 人头自费费用分组,sum(自费) 自费,COUNT(certno) 人数,8 截至月份 FROM t9 GROUP by  人员类别,人头自费费用分组 
UNION  ALL
 SELECT 人员类别, 人头自费费用分组,sum(自费) 自费,COUNT(certno) 人数,9 截至月份 FROM t10 GROUP by  人员类别,人头自费费用分组  
UNION  ALL
 SELECT 人员类别, 人头自费费用分组,sum(自费) 自费,COUNT(certno) 人数,10 截至月份 FROM t11 GROUP by  人员类别,人头自费费用分组 
UNION  ALL
 SELECT 人员类别, 人头自费费用分组,sum(自费) 自费,COUNT(certno) 人数,11 截至月份 FROM t12 GROUP by  人员类别,人头自费费用分组  
UNION  ALL
 SELECT 人员类别, 人头自费费用分组,sum(自费) 自费,COUNT(certno) 人数,12 截至月份 FROM t13 GROUP by  人员类别,人头自费费用分组 
  
 )
SELECT * FROM t14;

代码解读

  1. t1 先做基本处理,可以按照实际业务来。
  2. t2-t13 按每个月截至
  3. t14 将 t2-t13 和在一起
  4. 最后进行输出结果
相关推荐
YangYang9YangYan32 分钟前
2026年二本电子工程与信息技术专业就业数据分析实用指南
数据挖掘·数据分析
阿演1 小时前
DataDjinn v0.2.11:SQL 编辑、AI 协作和表格操作继续打磨
数据库·人工智能·sql
智脑API平台3 小时前
Codex 国内使用会封号吗?账号安全、中转站和合规边界说明
数据库·redis·缓存
l1t3 小时前
duckdb 1.6dev新增的.manual命令
开发语言·数据库
辉灰笔记3 小时前
第一篇:MySQL8.0生产备份实战|XtraBackup全自动全量+增量备份(钉钉告警+异地Binlog归档)
数据库·mysql·钉钉·运维开发
山峰哥3 小时前
‌Explain实战:打开数据库执行计划的黑盒‌
大数据·服务器·数据库·sql·深度优先·宽度优先
ClickHouseDB4 小时前
ClickHouse 26.6 版本发布说明
数据库
Wang's Blog4 小时前
Java框架快速入门:深入MyBatis-Plus高级DML操作(ID策略·逻辑删除·乐观锁)
java·数据库·mybatis
RestCloud14 小时前
借助ETL工具,实现AI智能体+数据的落地
数据仓库·人工智能·sql·etl·etlcloud·数据集成平台·java脚本
小二·15 小时前
RAG + 向量数据库实战:ChromaDB / Milvus / FAISS 选型与性能横评
数据库·milvus·faiss