SQL Server 2008:
假设一个客户表和一个名为“Shipping_State”的列。我想在所有拥有Shipping_State = Ohio值的客户中平均花费10,000美元的运费,所以如果在俄亥俄州的1个月中有2个,那么它将是5,000个,如果下个月有100个,它将是100个一块。 我在表中有一个空白列,名为Cost,用于该计算值。 Cost是十进制(18,4)数据类型。我希望能够将查询用于任何数据类型(通常是nchar)。
我将如何做到这一点?我在SQL Server Mgmt Studio中的错误代码返回消息:
Msg 157,Level 15,State 1,Line 1聚合可能不会出现在 设置UPDATE语句的列表。
UPDATE CustomerTable
SET Cost = (10000 / COUNT(CustomerTable.Shipping_State))
WHERE CustomerTable.Shipping_State = 'Ohio';
答案 0 :(得分:2)
你需要做一个子查询来获取计数,然后根据这个值进行更新,这样的事情应该有效:
UPDATE CustomerTable
SET Cost = (10000 / CTCount.Shipping_State_Count)
FROM CustomerTable CT
INNER JOIN (
SELECT Shipping_State, COUNT(Shipping_State) AS Shipping_State_Count
FROM CustomerTable
GROUP BY Shipping_State) CTCount ON
CT.Shipping_State = CTCount.Shipping_State
WHERE CT.Shipping_State = 'Ohio';
答案 1 :(得分:2)
使用嵌套的SELECT
。
UPDATE CustomerTable
SET Cost = (SELECT 10000.0 / count(*)
FROM CustomerTable
WHERE CustomerTable.Shipping_state = 'Ohio')
WHERE CustomerTable.Shipping_State = 'Ohio';
答案 2 :(得分:1)
SQL Server提供了两种真正有助于此类查询的功能。第一个是可更新的CTE,第二个是窗口函数。
with toupdate as (
select ct.*, count(*) over (partition by ct.Shipping_State) as cnt
from CustomerTable
where ct.Shipping_State = 'Ohio'
)
update toupdate
set Cost = cast(10000 as float) / cnt;
请注意,10000
会转换为浮点数。 SQL Server进行整数除法,我假设你想要整数(实际上,money
可能是更好的数据类型)。
目前尚不清楚"月"适合,但这可能更接近你正在寻找的东西:
with toupdate as (
select ct.*, count(*) over (partition by ct.Shipping_State, month(ct.Shipping_Date) as cnt
from CustomerTable
where ct.Shipping_State = 'Ohio'
)
update toupdate
set Cost = cast(10000 as float) / cnt;
请注意partition by
子句的更改。