You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何编写列多值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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 03:37:02