使用客户的金额总和替换或更新空值

时间:2013-12-30 02:42:31

标签: sql sql-server sql-server-2008 sql-update sum

首先,我的表格如下所示:

cust_id/Bill_amt/Brand/BrandA/BrandB/Total_value
100/350/A/NULL  /NULL/NULL
100/250/A/NULL/NULL/NULL
100/100/B/NULL  /NULL/NULL
300/200/B/NULL  /NULL/NULL

我想将'null'值替换为同一客户的支出金额,正如您从上表中可以看到的,有重复客户使用cust_id 100,这是因为此客户同时购买了品牌A和B在不同的日期,因此,我需要你的帮助在一行中总结该客户的所有内容,在将所有内容放在一行之后,您会注意到有3行具有相同的记录(重复),如下所示:

cust_id/Bill_amt/Brand/BrandA/BrandB/Total_value
100/350/A/600/100/700
100/250/A/600/100/700
100/100/B/600/100/700
300/200/B/0/200/200

例如,cust_id 100为品牌A花费600美元(350 + 250),而此客户仅为品牌B花费100美元(查看第3行cutomer_id 100),因此,总价值为700美元(600 + 100) )。

我希望这个解释对你来说足够清楚了。

更新表后如下图所示,我们将自行删除重复项。

请向我们提供SQL查询,以帮助我们用bill_amt的总和替换或更新'null'值,因为我们有200000加上记录。

非常感谢你花时间回复我们。

1 个答案:

答案 0 :(得分:0)

为什么你需要品牌,品牌,总价值?这不需要。

;WITH cte 
     AS (SELECT cust_id, 
                brand, 
                Sum(bill_amt) bill_amt 
         FROM   @t 
         GROUP  BY rollup( cust_id, brand )) 
UPDATE @t 
SET    branda = COALESCE(a.bill_amt, 0), 
       brandb = COALESCE(c.bill_amt, 0), 
       total_value = COALESCE(d.bill_amt, 0) 
FROM   @t b 
       LEFT JOIN cte a 
              ON a.cust_id = b.cust_id 
                 AND a.brand = 'A' 
       LEFT JOIN cte c 
              ON b.cust_id = c.cust_id 
                 AND c.brand = 'B' 
       LEFT JOIN cte d 
              ON b.cust_id = d.cust_id 
                 AND d.brand IS NULL 

SELECT * 
FROM   @t