我有以下数据:
htno sub marks credits
1 a 15 0
1 b 10 0
1 c 25 4
1 d 24 4
1 e 22 2
1 f 12 0
2 a 22 4
2 b 15 0
2 c 23 4
2 d 18 2
2 e 20 4
2 f 6 0
3 a 22 4 n so on
我将向用户提供表格。如果用户输入他的halticket数字“1”,那么它应该以这种方式在PHP和MySQL中显示输出:
Number of Backlogs Passed Subjects
3 3
这意味着它应该计算零的数量并显示积压的数量并计算非零的数量并显示传递的主题的数量。
我该怎么做?
答案 0 :(得分:12)
我从文本格式的数据中删除了尾部和前导空格,并使用SQL Fiddle创建了一个等效的示例模式。设置如下:
CREATE TABLE Grades
(`htno` int, `sub` varchar(1), `marks` int, `credits` int)
;
INSERT INTO Grades
(`htno`, `sub`, `marks`, `credits`)
VALUES
(1, 'a', 15, 0),
(1, 'b', 10, 0),
(1, 'c', 25, 4),
(1, 'd', 24, 4),
(1, 'e', 22, 2),
(1, 'f', 12, 0),
(2, 'a', 22, 4),
(2, 'b', 15, 0),
(2, 'c', 23, 4),
(2, 'd', 18, 2),
(2, 'e', 20, 4),
(2, 'f', 6, 0),
(3, 'a', 22, 4)
;
我做了以下假设:
htno
列表示。credits
列中的零值代表学生“积压”中的主题。credits
列中的值大于零表示“已通过主题”。此查询符合您的要求:
SELECT
SUM(CASE WHEN credits = 0 THEN 1 ELSE 0 END) AS `Number of backlogs`,
SUM(CASE WHEN credits > 0 THEN 1 ELSE 0 END) AS `Passed subjects`
FROM Grades
WHERE htno = 1;
我们从等级表中SELECT
使用WHERE
过滤器为学生设置了halticket编号为1的所有行。
第一个CASE
表达式计算一个新列,如果credit不为零,则包含0,否则包含1。
第二个CASE
表达式计算一个新列,如果信用是非正数,则包含0,否则包含1。
您可以想象中间结果如下所示:
[Case expression 1] [Case expression 2]
0 1
0 1
1 0
1 0
1 0
0 1
我们将整个结果集视为聚合组,并使用SUM
函数将第一和第二个计算列中的所有值相加。
第一列的总和为3,第二列的总和为3.
这为您提供了最终结果集。
您可以在SQL Fiddle上试用我的互动解决方案。