2011-08-23 160 views
0

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

请为您的示例数据添加期望的结果。 –

+0

开始放下截然不同的东西。你正在滥用它,因为你想要的是一个聚合(group by),它隐藏了你的问题。你需要更准确地预测你期望的结果。学生1可以有多个检查每个检查多个活动。因此,学生可以在同一套“吸烟”,“不吸烟”和“清除”。你将不得不定义如何汇总。一旦你这样做,你最终会在你当前的查询中得到一个分组,或者通过子选择结果 – Eddy

+0

Smith我添加了所需的结果集。 – palum

回答

1

根据你的榜样结果和原始查询我想你需要的东西沿着这些路线。

SELECT S.STUDENTID , 
     A.[CHECK-UP] , 
     A.[INDEX] , 
     A.[VALUE] , 
     CASE [VALUE] 
      WHEN 'SMOKING' THEN 'LMDO' 
      WHEN 'NOT SMOKING' THEN 'LMD1' 
      ELSE 'CLEAR' 
     END done , 
     S.[DATE] 
FROM STUDENT S 
     LEFT JOIN ACTIVITY A ON S.[CHECK-UP] = A.[CHECK-UP] 
           AND A.[INDEX] = 1 
+0

I试着通过把A. [INDEX] = 1我相信我们正在限制数据,NULL值不会被捕获在结果集中。 – palum

+0

@palum - 您的查询在“where”而不是“outer join”中有过滤器。对于您的示例数据,它将返回您所需的结果[在此演示](http://data.stackexchange.com/stackoverflow/q/110268/) –