能否請您解釋這種情況背後的邏輯情況下,T-SQL在SQL Server 2005/2008
我有2個表
student表
CHECK-UP(PK) STUDENTID DATE
1001 1 06/15/1980
1002 1 07/30/1980
1003 1 12/28/1980
1004 2 03/22/1981
1005 2 01/28/1981
1006 3 04/20/1981
活動表
CHECK-UP INDEX VALUE
1001 1 SMOKING
1001 2 ALCOHOL
1001 3 DRUGS
1002 1 SMOKING
1002 2 ALCOHOL
1003 1 SMOKING
1003 3 DRUGS
1004 3 DRUGS
我在兩個表格之間使用簡單的內部連接來獲取與值'%SMOKING%'
匹配的所有記錄。它給我3行有吸菸值,結果集爲1001,1002,1003
,相應的studentsid爲1.
我需要做些什麼才能找到所有學生的吸菸信息?
在這種情況下,我必須首先在表格之間進行左連接以獲取所有記錄,但這不適用於我的情況以包含所有學生。請指教。下面是一段代碼。
Select DISTINCT STUDENTID
,CHECK-UP
,INDEX
,CAST(VALUE as VARCHAR(MAX)) --CASTING IT SINCE IT IS A TEXT FIELD
,CASE
WHEN (PATINDEX('%SMOKING%',act.VALUE)) THEN
'LMDO'
WHEN (PATINDEX('%NOT SMOKING%',act.VALUE)) THEN
'LMD1'
WHEN (ISNULL(CAST(act.VALUE as varchar(max)),'')='') THEN
'CLEAR'
ELSE
'CLEAR'
END done
FROM STUDENT stu
LEFT JOIN ACTIVITY act
ON stu.CHECK-UP=act.CHECK-UP
WHERE ??
如果假設爲studentID=3
該學生沒有排隊吸菸。我希望這個價值進入'清除'時段。此外,我無法在條款中添加條件,因爲它會限制我的數據。可以做些什麼來解決這個問題?
我期待一個結果集是這樣的:
STUDENTID CHECK-UP INDEX VALUE DONE DATE
1 1001 1 SMOKING LMDO 06/15/1980
1 1002 1 SMOKING LMDO 07/30/1980
1 1003 1 SMOKING LMDO 12/28/1980
2 1004 NULL NULL CLEAR 03/22/1981
2 1005 NULL NULL CLEAR 01/28/1981
3 1006 NULL NULL CLEAR 04/20/1981
請爲您的示例數據添加期望的結果。 –
開始放下截然不同的東西。你正在濫用它,因爲你想要的是一個聚合(group by),它隱藏了你的問題。你需要更準確地預測你期望的結果。學生1可以有多個檢查每個檢查多個活動。因此,學生可以在同一套「吸菸」,「不吸菸」和「清除」。你將不得不定義如何彙總。一旦你這樣做,你最終會在你當前的查詢中得到一個分組,或者通過子選擇結果 – Eddy
Smith我添加了所需的結果集。 – palum