2017-07-31 45 views
2

如何搜索成绩列表中的成绩?一些等级是字符串数据类型,例如'PK'和'KK'。TSQL:如何搜索成绩列表中的成绩?

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

我正在尝试的逻辑是像什么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 
+0

您正在使用哪个版本的SQL Server? – Eli

回答

2

这将为您提供CurrentGrade在SchoolGrades中的行。

SELECT * 
FROM StudentGrades 
WHERE ', ' + SchoolGrades + ', ' LIKE '%, ' + CurrentGrade + ', %' 

编辑:这是从评论帮助下的最佳解决方案。谢谢,所有。

+0

你测试过了吗? – scsimon

+0

@scsimon Yup。我认为这是OP所要求的,但逻辑倒退? – justiceorjustus

+0

这正是我一直在寻找的!谢谢@justiceorjustus。感谢所有回复的人,我不确定如何从逻辑上提出这个问题。 – JM1

0

基础上FATC的成绩是在字符串字段可以使用like

select * from StudentGrades 
where schoolGrades like '%11%'; 

select * from StudentGrades 
where schoolGrades like '%KK%'; 
+0

谢谢@scaisEdge,如果有一千名学生,每个学生在不同的年级和不同的学校,我怎么能做到这一点?类似于('%SchoolGrades%')的类似于CurrentGrade的内容? – JM1

0
select * from StudentGrades 
where schoolGrades like '%KK%' OR schoolGrades like '%PK%'; 
0

可以使用递归CTE来反转SchoolGrades中的数据。然后消除所需的值,并在CTE中选择一个简单的where子句。由于递归循环是按记录方法记录的,因此不确定性能如何;但是它可能会比使用2个全表扫描更快。

工作例如:

http://rextester.com/NAB12900

  1. strCTE得到的数值数据标准化的对我们
  2. subcte提供数据标准化
  3. 最后查询各行内的所需等级仅限于当前级别匹配stringvalue。

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作为分析完成的物化视图。因为物化视图可以具有减少来自递归循环的性能损失的索引。