SQL UPDATE:整数除以Count Distinct值

时间:2014-05-20 18:20:19

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

这是这个问题的补充,我问过将整数除以指定值的计数: SQL UPDATE: integer divided by count of a specified value

我正在尝试调整它以根据不同值的计数来划分整数。

示例:Shipping_State中每个不同事件的10,000美元运费将平均分配给该不同事件中的记录数。该值将显示在“成本”列中。

因此,对于说俄亥俄州的5条记录,费用为每个2000.0000,德克萨斯州的10条记录将分别返回1000.0000,加州42条记录,每条238.0952等。

  • 表:CustomerTable
  • 列:Shipping_State nchar, Cost decimal(18,4)

我做了一些徒劳的努力,这是一次尝试:

UPDATE CustomerTable
SET Cost = (SELECT 10000.00 / count(*)
            FROM CustomerTable
            WHERE CustomerTable.Shipping_state = COUNT(DISTINCT CustomerTable.Shipping_State)
WHERE CustomerTable.Shipping_State = COUNT(DISTINCT CustomerTable.Shipping_State;

我收到此错误:

  

Msg 147,Level 15,State 1,Line 5
  除非是聚合,否则聚合可能不会出现在WHERE子句中   在HAVING子句或选择列表中包含的子查询中,   被聚合的列是外部引用。

1 个答案:

答案 0 :(得分:1)

我认为这就是你要找的东西:

UPDATE CustomerTable
    SET Cost = (SELECT 10000.00 / count(*)
                FROM CustomerTable ct2
                WHERE CustomerTable.Shipping_state = ct2.Shipping_State
               );

我认为您对我之前的问题的解决方案更好,但没有where

with toupdate as (
      select ct.*, count(*) over (partition by ct.Shipping_State, month(ct.Shipping_Date)) as cnt
      from CustomerTable
     )
update toupdate
    set Cost = cast(10000 as float) / cnt;

编辑:

如果您不想要日期,只需将其从partition by子句中删除:

with toupdate as (
      select ct.*, count(*) over (partition by ct.Shipping_State) as cnt
      from CustomerTable
     )
update toupdate
    set Cost = cast(10000 as float) / cnt;