sql - 如何计算一个单元格中的数字与另一个表中列的 SUM 之间的差异

标签 sql postgresql

我有不同类(class)的数据库。我的目标是计算任何类(class)的免费名额。我在一张表中有一个属性,显示有多少人可以上课。在另一张表中,我有关于学生的信息,我可以在其中看到学生正在学习哪个类(class)。所以,也许我应该计算所有名额的数量和类的学生数量之间的差异。

我通过以下方式进行了查询:

SELECT (classes.amount_of_students - (SELECT COUNT(id_class) 
                                      FROM classes_students 
                                      WHERE id_class = 1)) AS free_places 
FROM classes 
  INNER JOIN classes_students ON classes.id_class = classes_students.id_class;

但不幸的是我有以下错误:

ERROR:  operator does not exist: character varying - bigint
LINE 1: SELECT (classes.amount_of_students - (SELECT COUNT(id_class)...
                                           ^
HINT:  No operator matches the given name and argument type(s). You might need to add explicit type casts.

那么,问题是什么,我该如何解决?

UPD

classes_student

 id_class | id_student 
----------+------------
        1 |          1
        2 |          2
        1 |          3

students

id_student |  name  |  last_name   |      email      |   login   | password 
------------+--------+--------------+-----------------+-----------+----------
          1 | Serhei | Mikhailovski | serega@mail.ru  | serzh     | 12345
          2 | Bogdan | Zaitsev      | zaitsev@mail.ru | bodyaga   | qwerty
          3 | Vadim  | Yachin       | yachin@mail.ru  | yanchilla | 13371488


CREATE TABLE classes_students (
    id_class SERIAL REFERENCES classes (id_class),
    id_student SERIAL REFERENCES student (id_student),
    PRIMARY KEY (id_class, id_student)
);

    CREATE TABLE classes (
    id_class SERIAL PRIMARY KEY,
    amount_of_hours VARCHAR NOT NULL,
    amount_of_students VARCHAR NOT NULL,
    id_subject SERIAL REFERENCES subject (id_subject),
    id_teacher SERIAL REFERENCES teacher (id_teacher)
);  

最佳答案

正如@a_horse_with_no_name 对您的帖子的评论,您正试图从行中的 varchar 中减去一个 number:

(classes.amount_of_students - (SELECT COUNT(id_class) 

因为 classes.amount_of_studentsVARCHAR 类型。
因此,您需要更改 classes 的表列 amount_of_students 并将其类型更改为 int:

ALTER TABLE classes
ALTER COLUMN amount_of_students TYPE INT

或者在您的查询中将其转换整数:

(nullif(classes.amount_of_students, '')::int - (SELECT COUNT(id_class) 

关于sql - 如何计算一个单元格中的数字与另一个表中列的 SUM 之间的差异,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55724029/

相关文章:

mysql - 根据MySQL中的外键选择第二个表上的行数

sql - 我可以在命名实例上使用 Azure 混合 SQL 连接吗?

postgresql - postgres "Returns Table"返回一个字符串

每天的 SQL 累计总和用每个用户的新余额刷新

postgresql - 如何在postgres中编译程序

mysql - SQL - 查找键等于值的所有 "Relationship IDs",然后选择包含这些 "Relationship IDs"的所有记录

Mysql根据等级DESC和经验DESC计算排名

sql - 查询以选择并组合表中的最高值和最低值

python 子进程(或相关)- 加载 psql 转储,出现错误 - '<' 被忽略

postgresql - 使用 EF Core 和 Npgsql 查询行(复合)值