sql数据问题

如图所示,11月份没有数据的话,怎么把10月份的数据填充进去??image.png

九九九九九 发布于 2021-12-2 17:27
1min目标场景问卷 立即参与
回答问题
悬赏:3 F币 + 添加悬赏
提示:增加悬赏、完善问题、追问等操作,可使您的问题被置顶,并向所有关注者发送通知
共4回答
最佳回答
0
zsh331Lv8专家互助
发布于2021-12-2 17:30(编辑于 2021-12-2 17:54)

- - 填充的话,那12月份的数据应该是8还是18?,如果是18就采用开窗函数组层汇总处理;如果是8,那就用「表与表的错位关联」处理,视需求自行选择;

——————————

SQL 数据分组累加sum() over (partition by ... order by ...)-https://blog.csdn.net/yole_grise/article/details/87921671

  • 九九九九九 九九九九九(提问者) 12月是8,只有当月空数据的话,就累加上一个月的数据,你发的这个链接看不懂,大佬
    2021-12-03 09:00 
  • zsh331 zsh331 回复 九九九九九(提问者) 如果是这个逻辑,那就用时间字段错位关联判断,但说实话,这个需求逻辑有点看不懂,?
    2021-12-03 09:12 
  • 九九九九九 九九九九九(提问者) 回复 zsh331 就是说统计一个需求人数,10月有10个需求,11月没有新增的话,11月需求就还是10个,12月如果减少2个,12月就是8个,10,11月还是8个,做报表统计的。 我也觉得需求很sx,啊哈哈哈哈,错位关联是什么意思啊,没写过,啊哈哈哈哈
    2021-12-03 09:15 
  • zsh331 zsh331 回复 九九九九九(提问者) 呃,需求千变万化,我们只能尽量去满足;错位关联的意思大概就是月份相差一,左右合并。就是找当前月与上个月的数据行关联,判断值的情况;理解下意思,灵活运用吧!这需求有点。。哈哈
    2021-12-03 09:19 
最佳回答
0
北纬六十六度Lv4初级互助
发布于2021-12-3 09:06(编辑于 2021-12-3 09:31)

case when demand_num is null then dbo.findmonth(month) else demand_num  end

dbo.findmonth(month) 新建一个函数,根据参数月份查询上月的 demand_num 

适用于mssql

image.png

做好函数,用case when 处理为空时计算上个月的num

  • 九九九九九 九九九九九(提问者) 看不懂,select qqq.`month`, qwe.demand_num from ( SELECT date_format( @lastDay := last_day( date_add( @lastDay, INTERVAL 1 MONTH ) ), \'%Y年%m月\' ) `month` FROM ( SELECT @lastDay := date_add( curdate(), INTERVAL - 6 MONTH ) FROM project.`t_project_demand_person` LIMIT 6 )qwe ) qqq LEFT JOIN ( SELECT demand_num, DATE_FORMAT( create_time, \'%Y年%m月\' ) `month` FROM `t_project_demand_person` WHERE project_id = \'12345\' GROUP BY `month` ,demand_num ) qwe on qqq.`month`=qwe.`month` 敢不敢来一个完成的,哈哈哈哈
    2021-12-03 09:19 
  • 北纬六十六度 北纬六十六度 回复 九九九九九(提问者) 会建标量值函数吗,你写一句SQL语句,根据得到的month值,求上一个monthde 的demand_num 值,把这句查询做成函数
    2021-12-03 09:31 
最佳回答
0
杨朝健Lv5中级互助
发布于2021-12-3 09:32(编辑于 2021-12-3 09:34)

用窗口函数加一列为 上一行(月)  的数据,然后判断当前行是否null 取上一行(月)或取当前行

https://blog.csdn.net/rfb0204421/article/details/7675877/

最佳回答
0
快乐星光Lv5中级互助
发布于2021-12-3 11:53(编辑于 2021-12-3 12:23)

有一个简单粗暴的方法,把月份加一错开和原表left join 。你把table_yourtable换成你的表试一下。

select a.usedate,

       case when a.demand_num is null then b.demand_num else a.demand_num end  as new_demand_num

from

(select CONVERT(varchar(100), create_time, 112) usedate,demand_num from table_yourtable) a

left join

(select CONVERT(varchar(100), create_time, 112)+1 usedate,demand_num from table_yourtable) b on a.usedate=b.usedate

上面是不管跨年和一月份数据,如果一月份数据也要处理就用下面语句:

select a.usedate,

       case when a.demand_num is null then b.demand_num else a.demand_num end  as new_demand_num

from

(select CONVERT(varchar(100), create_time, 112) usedate,demand_num from table_yourtable) a

left join

(select case when month(create_time) = 12 then CONVERT(varchar(100),DATEADD(yy,DATEDIFF(yy,0,dateadd(year,-1,create_time)),0), 112) 

         else CONVERT(varchar(100), create_time, 112)+1 end as usedate,

         demand_num from table_yourtable  where month(create_time)<> 01 ) b on a.usedate=b.usedate

  • 5关注人数
  • 558浏览人数
  • 最后回答于:2021-12-3 12:23
    请选择关闭问题的原因
    确定 取消
    返回顶部