能否请您解释这种情况背后的逻辑情况下,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