Как вложить логику в корпус блока sql - PullRequest
0 голосов
/ 11 июля 2019

У меня есть таблица с результатами тестов для студентов.Для каждого типа теста может быть более 1 балла.Таким образом, учащийся A может иметь несколько баллов для теста 1, один балл для теста 2 и т. Д.

В принципе, если у студента есть только тестовый балл для теста 1, я хочу выполнить x.И если у ученика есть несколько тестов для теста 1, я хочу сделать у.Как я могу это сделать?

Пока мой запрос:

SELECT A.*
  ,T.TestType
  ,CASE
    WHEN T.TestType = 'test_1' THEN T.MessageLocation
  END AS Loc
FROM #Person A
LEFT JOIN #TestScores T ON A.TestID = T.ID

Но я хочу сделать (псевдокод):

SELECT A.*
  ,T.TestType
  ,CASE
    -- when count(test_1) = 1 THEN T.MessageLocation
    -- when count(test_1) > 1 THEN
    -- for each row T.AltMessageLocation
  END AS Loc
FROM #Person A
LEFT JOIN #TestScores T ON A.TestID = T.ID

1 Ответ

0 голосов
/ 11 июля 2019

Сначала необходимо объединить данные по ResrID и TestType, добавить результат, объединить с существующим запросом.Предполагая, что вы используете SQL Server, это будет что-то вроде:

;WITH cteTestNum(
  SELECT T.ID,T.TestType,COUNT(*) AS TestNum
  FROM #Person A
  INNER JOIN #TestScores T 
  ON A.TestID = T.ID
  GROUP BY T.ID,T.TestType
)
SELECT A.*
  ,T.TestType
  ,CASE
    WHEN ISNULL(N.TestType,N'') = 'test_1' AND ISNULL(N.TestNum,0)>1 THEN T.MessageLocation
    WHEN ISNULL(N.TestType,N'') = 'test_1' AND ISNULL(N.TestNum,0)>1 THEN T.AltMessageLocation
    ELSE N'' -- no tests
  END AS Loc
FROM #Person A
LEFT JOIN #TestScores T
ON A.TestID = T.ID
LEFT JOIN cteTestNum N
ON N.ID=T.ID
AND N.TestType=T.TestType;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...