SQL UPDATE:整数除以指定值的计数

时间:2014-05-20 16:11:19

标签: sql sql-server sql-server-2008

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';

3 个答案:

答案 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子句的更改。