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

SQL Server中如何按月份筛选实现自交叉连接?

实现同月份内员工表的自交叉连接

当然有可行的实现方法,你的思路方向完全正确——通过自连接并限定同月份的条件,就能精准实现每个月内部员工数据的交叉匹配。

基础实现方案

直接将表与自身做关联,把连接条件设为两张表的Month字段相等即可:

SELECT 
    t1.Month,
    t1.Emp_id AS Employee_A,
    t2.Emp_id AS Employee_B
FROM 
    your_table_name t1
JOIN 
    your_table_name t2 
ON 
    t1.Month = t2.Month;

这个查询会返回每个月内所有员工的两两组合,包括员工与自身的配对(比如Employee_A和Employee_B都是123的情况)。如果需要排除这种自配对记录,只需在连接条件里额外加一个判断:

SELECT 
    t1.Month,
    t1.Emp_id AS Employee_A,
    t2.Emp_id AS Employee_B
FROM 
    your_table_name t1
JOIN 
    your_table_name t2 
ON 
    t1.Month = t2.Month
    AND t1.Emp_id != t2.Emp_id;

针对日期字段的细节注意

如果你的Month字段是带具体日的日期类型(比如示例中的1/1/2017是当月第一天),而实际数据中可能存在同一个月不同日期的记录,直接用t1.Month = t2.Month会只匹配同一天的记录,而非整个月份。这时需要用数据库对应的函数提取年月来做连接条件:

  • MySQL/MariaDB:
    ON DATE_FORMAT(t1.Month, '%Y-%m') = DATE_FORMAT(t2.Month, '%Y-%m')
    
  • SQL Server:
    ON DATEPART(YEAR, t1.Month) = DATEPART(YEAR, t2.Month)
       AND DATEPART(MONTH, t1.Month) = DATEPART(MONTH, t2.Month)
    
  • PostgreSQL:
    ON TO_CHAR(t1.Month, 'YYYY-MM') = TO_CHAR(t2.Month, 'YYYY-MM')
    

结果规模验证

按照你描述的场景:每月100名员工、共12个月,用基础方案(包含自配对)的话,每个月会生成100*100=10000条记录,12个月总计12*10000=120000条记录,完全符合你的预期。如果排除自配对,每个月会生成100*99=9900条记录,总计12*9900=118800条。

内容的提问来源于stack exchange,提问作者screechOwl

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 06:55:48