计算MySQL中的零数

时间:2012-09-13 16:11:22

标签: mysql sql counting

我有以下数据:

    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

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

我该怎么做?

1 个答案:

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

我做了以下假设:

  • 每一行代表学生在某一科目中的成就。
  • “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使用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上试用我的互动解决方案。