ДЕЛО в T-SQL в SQL Server 2005/2008 - PullRequest
       10

ДЕЛО в T-SQL в SQL Server 2005/2008

0 голосов
/ 24 августа 2011

Можете ли вы объяснить логику такого сценария

У меня есть 2 таблицы

СТОЛ ДЛЯ СТУДЕНТОВ

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, а соответствующий идентификатор студента будет равен 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 у студента нет места для курения.Я хочу, чтобы это значение вошло в «CLEAR».ТАКЖЕ я не могу поставить условие в WHERE CLAUSE, так как это ограничит мои данные.Что можно сделать, чтобы решить эту проблему?

Я ожидаю, что набор результатов будет примерно таким:

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

1 Ответ

1 голос
/ 24 августа 2011

Исходя из результатов вашего примера и исходного запроса, я предполагаю, что вам нужно что-то в этом роде.

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...