我正在尝试根据列级别返回列级别的计数。如果“列级别”等于“ 1”,那么我想计算“成绩”为“ A”,“ B”,“ C”或“ D”的列ID的所有行。如果列“级别”等于“ 2”,那么我想计算列级别为“ A”,“ B”或“ C”的列ID的所有行,
示例表:
示例输出:
答案 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];