繁体   English   中英

如何在sql的case块中嵌套逻辑

[英]How to nest logic in a case block of sql

我有一张桌子,上面有学生的考试成绩。 每种测试类型的得分都可以超过1分。 因此,学生A的测验1可以有多个分数,测验2可以具有一个分数,依此类推。

基本上,如果一个学生只有测验1的测验分数,我想做x。 如果一个学生的测验1的测验分数多个,我想做y。 我该怎么做?

到目前为止,我的查询是:

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

您首先需要通过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;

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM