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

SQL Server双表查询:如何获取2019年6月人员得分结果?

解决SQL Server中获取2019年6月人员得分的查询问题

嘿,我来帮你搞定这个需求!首先得先明确下两张表的常见结构(因为你没给出具体字段,我先按常规业务场景假设):

  • Info表:一般包含人员唯一标识(比如PersonID)、人员姓名(PersonName)等基础信息
  • Score表:包含PersonID(关联Info表的外键)、ScoreValue(得分数值)、ScoreDate(得分记录的日期,datetime类型),或者单独的YearMonth(年月字段,比如201906格式)

情况1:Score表用datetime类型存储记录时间

如果你的Score表是用ScoreDate存日期的,就用下面的SQL语句——关联两张表后精准过滤2019年6月的数据,同时格式化出需要的年月列:

SELECT
    -- 把日期格式化为'2019-06'样式,也可根据需求改成'201906'
    FORMAT(s.ScoreDate, 'yyyy-MM') AS [年月],
    i.PersonName AS [人员姓名],
    s.ScoreValue AS [得分]
FROM
    Info i
INNER JOIN
    Score s ON i.PersonID = s.PersonID
WHERE
    -- 两种过滤写法可选:写法2在ScoreDate有索引时性能更好
    -- 写法1:用DATEPART匹配年和月
    DATEPART(YEAR, s.ScoreDate) = 2019
    AND DATEPART(MONTH, s.ScoreDate) = 6
    -- 写法2:用日期范围匹配
    -- s.ScoreDate >= '2019-06-01' AND s.ScoreDate < '2019-07-01'

情况2:Score表已有单独的年月字段

如果你的Score表直接存了YearMonth(比如值为201906),查询会更简洁:

SELECT
    -- 把数字格式的年月转换成'2019-06'样式,也可直接用原字段
    CONCAT(SUBSTRING(CONVERT(VARCHAR, s.YearMonth), 1, 4), '-', SUBSTRING(CONVERT(VARCHAR, s.YearMonth), 5, 2)) AS [年月],
    i.PersonName AS [人员姓名],
    s.ScoreValue AS [得分]
FROM
    Info i
INNER JOIN
    Score s ON i.PersonID = s.PersonID
WHERE
    s.YearMonth = 201906

额外补充说明

  • 如果同一个人在2019年6月有多条得分记录,上面的查询会返回所有明细。如果需要聚合结果(比如总分、平均分),可以加上GROUP BY:
    SELECT
        FORMAT(s.ScoreDate, 'yyyy-MM') AS [年月],
        i.PersonName AS [人员姓名],
        SUM(s.ScoreValue) AS [总分],
        AVG(s.ScoreValue) AS [平均分]
    FROM
        Info i
    INNER JOIN
        Score s ON i.PersonID = s.PersonID
    WHERE
        s.ScoreDate >= '2019-06-01' AND s.ScoreDate < '2019-07-01'
    GROUP BY
        FORMAT(s.ScoreDate, 'yyyy-MM'), i.PersonName
    
  • 要是想包含所有Info表中的人员(哪怕他们6月没有得分,得分显示为NULL),把INNER JOIN改成LEFT JOIN就行。

内容的提问来源于stack exchange,提问作者Hữu Vinh

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.13 07:43:06