TSQL:如何在成绩列表中搜索成绩?

时间:2017-07-31 14:41:01

标签: sql sql-server tsql

如何在成绩列表中搜索成绩?某些等级是字符串数据类型,例如“PK”和“KK”。

生产列表中有超过一千名学生,每个不同年级,所以我不确定如何确保查询能解决这个问题。

我正在尝试的逻辑类似于WHERE CurrentGrade('%SchoolGrades%')。

示例查询结果:

enter image description here

期望的结果:

enter image description here

(我没有设计我必须使用的表格,因为我知道它们不是最佳的,但这是我必须使用的,感谢您的帮助。)

示例代码:

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

4 个答案:

答案 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次的全表扫描更快。

工作示例:

http://rextester.com/NAB12900

  1. strCTE获取值以标准化我们的数据
  2. 子类提供了具有数据规范化的各行的所需等级
  3. ,最后一个查询仅限于当前成绩匹配字符串值。
  4. 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作为您的分析完成的物化视图。因为物化视图可以有索引,可以减少递归循环的性能损失。