我有不同类(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_students
是 VARCHAR
类型。
因此,您需要更改 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/