SQL多列查询:提取各id的12月expire值与null值lastwdIf
解决方案:关联NULL记录与12月expire值
核心需求是获取每个id的lastwdIf IS NULL的记录,并将该id对应的12月份expire值合并到同一行。以下是两种可行的SQL写法:
方法1:关联子查询
直接在主查询中嵌入子查询,获取对应id的12月expire值:
SELECT t.id, t.Name, t.Vendor, t.lastwdIf, -- 子查询获取当前id的12月expire值 (SELECT expire FROM your_table WHERE id = t.id AND MONTH(expire) = 12) AS expire_dec FROM your_table t WHERE t.lastwdIf IS NULL;
- 若某个id没有12月的expire记录,
expire_dec会返回NULL; - 若一个id存在多条12月expire记录,子查询会报错,此时可改用
MAX(expire)或MIN(expire)指定取某一条(比如最新的):(SELECT MAX(expire) FROM your_table WHERE id = t.id AND MONTH(expire) = 12) AS expire_dec
方法2:LEFT JOIN预查询结果
先提取所有12月的expire记录,再关联到lastwdIf IS NULL的主记录:
SELECT t.id, t.Name, t.Vendor, t.lastwdIf, dec.expire AS expire_dec FROM your_table t LEFT JOIN ( -- 预查询每个id的12月expire记录 SELECT id, expire FROM your_table WHERE MONTH(expire) = 12 ) dec ON t.id = dec.id WHERE t.lastwdIf IS NULL;
- LEFT JOIN确保即使id没有12月数据,主记录依然会被保留;
- 若存在多条12月记录,同样可以在子查询中用聚合函数去重,比如:
SELECT id, MAX(expire) AS expire FROM your_table WHERE MONTH(expire) = 12 GROUP BY id
注意事项
- 确保
expire是日期类型(DATE/DATETIME),如果是字符串格式,需先转换为日期再判断月份,例如:
(格式需根据实际存储的字符串调整)MONTH(STR_TO_DATE(expire, '%Y-%m-%d')) = 12
内容的提问来源于stack exchange,提问作者Lucas AA
相关产品推荐
相关产品推荐

