原始数据Servedt有三列,ID,Begain date,End date(黄色区域)。 表示某ID在20197月至2020年6月一年间某医疗服务的开始日和终止日,所以ID是有重复的,代表不同的医疗服务开始日期和终止日期。
想转换成新的格式(绿色区域),ID列和 日期列(2019年7月至2020年6月),如果ID在某月有医疗服务,就显示1,没有就显示0,这样我就可以知道在某个月是否这个ID有服务,而且我也可以计算某个月有多少ID用了服务。
SQL怎么实现转置?

可以参考我写的博客
这个问题实际上包含了很多个内容,用倒推的思路来分析,
- 要得到最后的结果,一定是需要进行行列转换,如果是oracle中,则可以使用pivot来转换,其他数据库也可以找到类似的操作
- 然后前一步一定是得到一个这样的数据
ID,月份,是否有医疗
一般用count是否大于0即可判断是否有医疗,再根据需要转换成0或者1显示 - 但由于原始数据是一个时间范围,而且判断依据某个月份也是时间范围,两个时间范围只有有任意一天时间重合,就认为满足条件,这个才是这个问题中最复杂的部分,可以使用分类讨论一下,容易得出满足条件的场景为以下两种,A.判断依据的任意一个时间点(即月初或者月末)有落在原始数据的时间范围内;B.判断依据的月初小于原始数据的开始时间且判断依据的月末大于原始数据的结束时间
- 最后就是用于判断的这个月份日期值,由于不排除出现原始数据中有月份空缺的情况,所以需要提前准备一张月份记录表,确保月份是完整的