1

我无法添加条件以仅显示出勤率低于 81 的人..

SELECT Absence.StudentID AS StudentNumber,
   Student.NAME AS "Student Name",
   Subject.NAME AS "Subject Name",
   CONVERT(VARCHAR, 100 - (100 * count(*) / 10)) AS 'Attendance(%)'
FROM Absence,
   Subject,
   Student,
   (
      SELECT COUNT(*) AS tot
      FROM Absence
      ) x
WHERE Subject.SubjectCode = Absence.SubjectCode
   AND Student.StudentNumber = Absence.StudentID
GROUP BY Absence.StudentID,
   Subject.NAME,
   Student.NAME;

以上是完全显示我想要的代码,但我不能只添加条件。我的出勤率(%) 已经是 int 了,对吗?所以使用 CAST 或 CONVERT 也不起作用。它说转换有问题。

4

2 回答 2

1

尝试获得百分比时,它乘以 100 并且是 DECIMAL,这似乎不是您的代码的工作方式:

SELECT (CAST(9 AS DECIMAL(5,2))/CAST(10 AS DECIMAL(5,2)))*CAST(100 AS DECIMAL(5,2))
-- Returns 90.00

SELECT (CAST(9 AS INT)/CAST(10 AS INT))*CAST(100 AS INT)
-- Returns 0

使用您的 OP 示例:

SELECT CAST(100 AS DECIMAL(5,2)) - ((CAST(100 AS DECIMAL(5,2)) * CAST(8 AS DECIMAL(5,2))) / CAST(10 AS DECIMAL(5,2)))
-- Returns 20.00

-- Formatted with a percent:
SELECT SUBSTRING(CAST(CAST(100 AS DECIMAL(5,2)) - ((CAST(100 AS DECIMAL(5,2)) * CAST(8 AS DECIMAL(5,2))) / CAST(10 AS DECIMAL(5,2))) AS VARCHAR(25)),1,5) + '%'

注意:这适用于SQL Server. 90% 是 0.9,当它是 .9 时被视为 0 CAST AS INT

于 2013-08-22T16:23:25.460 回答
1

这是数学中的隐式数据类型转换

select 100/50 as intMath , 100.00/50.00 as nbrMath

于 2013-08-22T16:22:45.967 回答