如何编写列多值SQL查询及统计出生日期各月份记录数
嘿,这两个需求其实都是日常SQL开发里很常见的场景,我来给你一步步拆解:
一、针对某列多值的SQL查询
这里分两种常见场景,你可以根据实际表结构选择:
场景1:列存储单个值,需要匹配多个目标值
这是最常用的情况,比如要查询department列是「技术部」或「产品部」的所有员工,直接用IN关键字就能搞定:
SELECT * FROM your_table_name -- 替换成你的表名 WHERE target_column IN ('值1', '值2', '值3'); -- target_column替换成目标列名,值按需调整
如果目标列是数字类型(比如用户ID、部门ID),去掉值的引号即可:
SELECT * FROM your_table_name WHERE target_column IN (101, 102, 103);
场景2:列存储多值(比如逗号分隔的字符串)
如果你的列用逗号/其他分隔符存多个值(比如skills列存java,python,sql),不同数据库的处理方式略有不同:
- MySQL:用
FIND_IN_SET函数匹配目标值
SELECT * FROM your_table_name WHERE FIND_IN_SET('目标值', target_multi_value_column) > 0; -- 示例:查询技能包含java的员工 SELECT * FROM users WHERE FIND_IN_SET('java', skills) > 0;
- PostgreSQL:用
string_to_array配合ANY关键字
SELECT * FROM your_table_name WHERE '目标值' = ANY(string_to_array(target_multi_value_column, ','));
- SQL Server:用
STRING_SPLIT拆分后匹配
SELECT DISTINCT t.* FROM your_table_name t CROSS APPLY STRING_SPLIT(t.target_multi_value_column, ',') s WHERE s.value = '目标值';
二、统计出生日期各月份的记录数量
核心要求是12个月份都要显示,哪怕该月份没有记录也要显示0,所以不能直接分组统计(会缺失无记录的月份),需要先生成包含1-12月的临时表,再左连接数据表统计。
下面是不同数据库的实现方案:
MySQL(8.0+支持CTE)
-- 生成包含1-12月的临时表 WITH months AS ( SELECT 1 AS month UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4 UNION ALL SELECT 5 UNION ALL SELECT 6 UNION ALL SELECT 7 UNION ALL SELECT 8 UNION ALL SELECT 9 UNION ALL SELECT 10 UNION ALL SELECT 11 UNION ALL SELECT 12 ) SELECT m.month, COUNT(t.birth_date) AS record_count -- 自动忽略NULL的出生日期 FROM months m LEFT JOIN your_table_name t ON MONTH(t.birth_date) = m.month GROUP BY m.month ORDER BY m.month;
如果要显示月份名称(比如「一月」),可以替换成MONTHNAME(STR_TO_DATE(m.month, '%m')) AS month_name。
PostgreSQL
PostgreSQL可以用generate_series快速生成1-12月:
WITH months AS ( SELECT generate_series(1,12) AS month ) SELECT m.month, COUNT(t.birth_date) AS record_count FROM months m LEFT JOIN your_table_name t ON EXTRACT(MONTH FROM t.birth_date) = m.month GROUP BY m.month ORDER BY m.month;
要显示月份名称的话,用TO_CHAR(m.month, 'FMMonth') AS month_name。
SQL Server
WITH months AS ( SELECT 1 AS month UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4 UNION ALL SELECT 5 UNION ALL SELECT 6 UNION ALL SELECT 7 UNION ALL SELECT 8 UNION ALL SELECT 9 UNION ALL SELECT 10 UNION ALL SELECT 11 UNION ALL SELECT 12 ) SELECT m.month, COUNT(t.birth_date) AS record_count FROM months m LEFT JOIN your_table_name t ON DATEPART(MONTH, t.birth_date) = m.month GROUP BY m.month ORDER BY m.month;
显示月份名称用DATENAME(MONTH, DATEFROMPARTS(2000, m.month, 1)) AS month_name。
内容的提问来源于stack exchange,提问作者Krishna Rao K G
相关产品推荐
相关产品推荐

