无法将计算应用于SQL Server中的所有行

时间:2018-02-04 11:03:01

标签: sql sql-server tsql

我在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表中的第一个薪水,然后在其他行中复制结果。你能帮我找到将计算应用到表中所有行的方法吗?

预期结果

Expected result

错误

Error

员工表

Staff table

2 个答案:

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