我在SQL Server中有一个Staff
表,其中包含Salary
列,我的目标是计算月度金额,然后显示它。我想出了两种方法来完成这项任务,但第二种方法不起作用。
这是我的代码:
第一种方法
SELECT
FirstName, FamilyName,
CAST(Salary / 12 AS DECIMAL(8,2)) AS AnnualSalary
FROM
[dbo].[Staff]
第二种方法
DECLARE @monthlySalary DECIMAL(8,2)
SELECT @monthlySalary = CAST(Salary / 12 AS DECIMAL(8, 2))
FROM [dbo].[Staff]
SELECT @monthlySalary AS MonthlySalary
FROM [dbo].[Staff]
在第二种方法中,它只计算Staff表中的第一个薪水,然后在其他行中复制结果。你能帮我找到将计算应用到表中所有行的方法吗?
预期结果
错误
员工表
答案 0 :(得分:3)
@annualSalary
具有固定值它不是函数
此行将为变量分配一个值:
SELECT @annualSalary = CAST(Salary/12 as DECIMAL(8,2))
FROM [dbo].[Staff]
在第二个命令中,您选择一个固定值,该值分配给@annualSalary
变量,并在Select查询中为每一行重复
SELECT @annualSalary AS AnnualSalary
FROM [dbo].[Staff]
更多信息
如果目标是计算您应该使用的所有工资的平均值
SELECT AVG(CAST(Salary / 12 AS DECIMAL(8, 2)))
FROM [dbo].[Staff]
否则你应该使用
SELECT CAST(Salary / 12 AS DECIMAL(8, 2))
FROM [dbo].[Staff]
答案 1 :(得分:0)
您的第二种方法是声明一个十进制类型的变量,它一次只能存储一个数字。 因此,当您执行第一个查询时,变量存储一个数字作为其值(我假设它是您提到的第一个工资值),然后在执行第二个查询时,您返回相同的值,即记录的数量在员工表中。 如果要存储工资的所有值,则可能必须使用光标...但查询将与第一个示例中的查询相同。 像
这样的东西DECLARE staff_cursor CURSOR
FOR SELECT FirstName, FamilyName, cast(Salary/12 as DECIMAL(8,2)) as AnnualSalary FROM [dbo].[Staff]
OPEN staff_cursor
FETCH NEXT FROM staff_cursor;