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
相关产品推荐
相关产品推荐

