如何在成绩列表中搜索成绩?某些等级是字符串数据类型,例如“PK”和“KK”。
生产列表中有超过一千名学生,每个不同年级,所以我不确定如何确保查询能解决这个问题。
我正在尝试的逻辑类似于WHERE CurrentGrade('%SchoolGrades%')。
示例查询结果:
期望的结果:
(我没有设计我必须使用的表格,因为我知道它们不是最佳的,但这是我必须使用的,感谢您的帮助。)
示例代码:
CREATE TABLE #StudentGrades(
StudentID int
, CurrentGrade varchar(255)
, SchoolEarliestGrade varchar(255)
, SchoolID int
, School varchar(255)
, SchoolGrades varchar(255)
)
INSERT INTO #StudentGrades (StudentID, CurrentGrade, SchoolEarliestGrade, SchoolID, School, SchoolGrades)
VALUES
(7777777, 11, 'PK' , 111 ,'Smith Elementary' ,'PK, KK, 01, 02, 03, 04, 05'),
(7777777, 11, '06' , 222 ,'Jones Middle' ,'06, 07, 08'),
(7777777, 11, '09' , 333 ,'Perez High School' ,'09, 10, 11, 12')
SELECT * FROM #StudentGrades
答案 0 :(得分:2)
这将为您提供CurrentGrade在SchoolGrades中的行。
{{1}}
编辑:这是评论帮助下的最佳解决方案。谢谢,全部。
答案 1 :(得分:0)
根据成绩在字符串字段中的fatc,您可以使用like
select * from StudentGrades
where schoolGrades like '%11%';
或
select * from StudentGrades
where schoolGrades like '%KK%';
答案 2 :(得分:0)
select * from StudentGrades
where schoolGrades like '%KK%' OR schoolGrades like '%PK%';
答案 3 :(得分:0)
可以使用递归CTE来取消学校中数据的分离,以及SchoolGrades的分隔值。然后驱动所需的值,并在针对CTE的选择中使用简单的where子句。不确定性能,因为递归循环是记录方法的记录;但它可能比使用2次的全表扫描更快。
工作示例:
WITH StrCTE AS
(
SELECT 1 start, CHARINDEX(',' , schoolGrades) stop, StudentID, CurrentGrade, SchoolEarliestGrade, SchoolID, School, SchoolGrades
FROM#studentGrades A
UNION ALL
SELECT stop + 1, CHARINDEX(',' ,schoolgrades , stop + 1), StudentID, CurrentGrade, SchoolEarliestGrade, SchoolID, School, SchoolGrades
FROM StrCTE A
WHERE stop > 0
),
SUBCTE AS (SELECT StudentID, CurrentGrade, SchoolEarliestGrade, SchoolID, School, SchoolGrades, ltrim(SUBSTRING(schoolgrades , start, CASE WHEN stop > 0 THEN stop-start ELSE 4000 END)) AS stringValue
FROM StrCTE)
SELECT *
FROM SUBCTE
WHERE currentgrade = stringValue
IMO这个strCTE查询使您能够规范化数据,从而允许其他标准SQL查询运行。也许创建STRCTE作为您的分析完成的物化视图。因为物化视图可以有索引,可以减少递归循环的性能损失。