我有下表
| 识别号|姓名|开始日期|结束日期|
| - ------|- ------|- ------|- ------|
| 1个|阿|二〇二一年十月十四日|二○二一年十二月二十二日|
| 第二章|抗体|二○二一年十二月二日|二〇二二年十月五日|
要求是添加YYYYMM格式的新列,其中包含min(StartDate)和max(EndDate)之间的所有月份,并为相应的单元格赋值。如果日期位于该行的StartDate和EndDate之间,则单元格值应为1;如果日期不在该日期范围内,则单元格值应为0。最终输出如下表所示
| 识别号|姓名|开始日期|结束日期|小行星202|小行星202|小行星202|小行星202201|小行星202202|小行星202|小行星202|小行星202|小行星202|小行星202|
| - ------|- ------|- ------|- ------|- ------|- ------|- ------|- ------|- ------|- ------|- ------|- ------|- ------|- ------|
| 1个|阿|二〇二一年十月十四日|二○二一年十二月二十二日|1个|1个|1个|无|无|无|无|无|无|无|
| 第二章|抗体|二○二一年十二月二日|2022年7月5日|无|无|1个|1个|1个|1个|1个|1个|1个|1个|
第1行,开始日期= 2021 - 10 - 14,结束日期= 2021 - 12 - 22,对应的新增列应为202110,202111,202112;并且这些列的相应单元值为1,而其它单元为0。同样的逻辑也应该应用于其它行。
我无法理解派生具有新列和相应单元格值的新表的逻辑。
1条答案
按热度按时间wecizke31#
使用动态SQL的这种方法怎么样:
生成的SQL:
结果:
| 识别号|姓名|开始日期|结束日期|小行星202|小行星202|小行星202|小行星202201|小行星202202|小行星202|小行星202|小行星202|小行星202|小行星202|小行星202|小行星202|小行星202210|
| - ------|- ------|- ------|- ------|- ------|- ------|- ------|- ------|- ------|- ------|- ------|- ------|- ------|- ------|- ------|- ------|- ------|
| 1个|阿|二〇二一年十月十四日|二○二一年十二月二十二日|1个|1个|1个|无|无|无|无|无|无|无|无|无|无|
| 第二章|抗体|二○二一年十二月二日|二〇二二年十月五日|无|无|1个|1个|1个|1个|1个|1个|1个|1个|1个|1个|1个|
参见this db<>fiddle。
上面使用了"start1〈= end2 AND start2〈= end1"的日期范围重叠的标准测试,它假设所有日期都包含在内。