-11

我有以下数据:

    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

我将向用户提供一个表格。如果用户输入他的电话号码“1”,那么它应该在 PHP 和 MySQL 中以这种方式显示输出:

            Number of Backlogs           Passed Subjects
                   3                           3

这意味着它应该计算零的数量并显示积压的数量并计算非零的数量并显示通过主题的数量。

我怎样才能做到这一点?

4

1 回答 1

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)
;

我做了以下假设:

  • 每行代表一个学生在某一学科中的成绩。
  • “halticket number”唯一标识每个学生,并由列表示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从 Grades 表中选择了 1 号学生的所有行。WHERE

第一个CASE表达式计算一个新列,如果 credits 不为零,则该列包含 0,否则包含 1。

第二个CASE表达式计算一个新列,如果 credits 为非正数,则该列包含 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上试用我的交互式解决方案。

于 2012-09-13T18:19:06.373 回答