【问题标题】:Replace or updates null values with the sum of amount spend for customers用客户花费的总和替换或更新空值
【发布时间】:2013-12-30 02:42:30
【问题描述】:

起初,我有一个如下所示的表格:

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 美元(查看 cutomer_id 100 的第 3 行),因此,总价值为 700 美元(600+100 )。

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

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

请向我们提供 SQL 查询,以帮助我们用 bill_amt 的总和替换或更新“null”值,因为我们有 200000 加记录来执行此操作。

非常感谢您抽出宝贵时间回复我们。

【问题讨论】:

  • 你需要标准化你的数据库。
  • @Leifingson 你能解释一下吗?
  • 而不是专注于如何查询,你的重复问题是因为表没有规范化。您有一个 M:N 关系,需要 cust_id 和相应购买之间的交集表。这样一来,查询就像查询客户 ID 和他们的购买一样简单。

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


【解决方案1】:

为什么需要 BrandA,BrandB,Total_value 列?这不是必需的。

;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 

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-12-06
    • 2020-12-11
    • 2021-12-28
    • 2021-09-07
    • 1970-01-01
    • 1970-01-01
    • 2019-11-08
    相关资源
    最近更新 更多