2017-07-31 97 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作爲分析完成的物化視圖。因爲物化視圖可以具有減少來自遞歸循環的性能損失的索引。