根据其他列在where子句中使用案例表达式选择条件

时间:2019-12-05 17:58:37

标签: sql sql-server case

我正在尝试根据列级别返回列级别的计数。如果“列级别”等于“ 1”,那么我想计算“成绩”为“ A”,“ B”,“ C”或“ D”的列ID的所有行。如果列“级别”等于“ 2”,那么我想计算列级别为“ A”,“ B”或“ C”的列ID的所有行,

示例表:

enter image description here

示例输出:

enter image description here

3 个答案:

答案 0 :(得分:2)

SELECT ID,SUM(CASE WHEN Level=1 AND Grade IN ('A','B','C','D') THEN 1 
            WHEN Level=2 AND Grade IN ('A','B','C') THEN 1
            ELSE 0
       END AS GradeCount
FROM YourTable
GROUP BY ID;

答案 1 :(得分:1)

在这种情况下,我认为不需要CASE表达式,甚至不需要。尝试对两个“案例”使用UNION:

SELECT
  1 AS ID,
  COUNT( 1 ) AS GradeCount
FROM
  LevelsAndGrades
WHERE
  ID = 1 AND
  Grade IN ( 'A', 'B', 'C', 'D' )
UNION
SELECT
  2 AS ID,
  COUNT( 1 ) AS GradeCount
FROM
  LevelsAndGrades
WHERE
  ID = 2 AND
  Grade IN ( 'A', 'B', 'C' )

答案 2 :(得分:0)

您可以使用case when表达式和sum聚合函数。

这是完整的示例代码:

CREATE TABLE #Grades ([Id] int, [Level] int, [Number] int, [Grade] nchar(1));

INSERT INTO #Grades VALUES
(1,1,100,'A'),
(1,1,101,'B'),
(1,1,102,'C'),
(1,1,103,'D'),
(1,1,104,'F'),

(2,2,300,'A'),
(2,2,301,'B'),
(2,2,302,'C'),
(2,2,303,'D'),
(2,2,304,'F');


SELECT Id, SUM(CASE WHEN  [Level] = 1 AND [Grade] IN ('A','B','C','D')   THEN 1 
                    WHEN  [Level] = 2 AND [Grade] IN ('A','B','C')       THEN 1
                    ELSE 0 
               END) 
FROM #Grades
GROUP BY [Id];