使用来自另一个表的百分比向用户表填充数据

时间:2013-11-03 18:26:16

标签: sql sql-server-2008

我有一个表用户(它有数百万行)

  Id         Name         Country          Product   
+----+---------------+---------------+--------------+
  1          John          Canada             
  2          Kate          Argentina                  
  3          Mark          China
  4          Max           Canada
  5          Sam           Argentina  
  6          Stacy         China           
  ...
  1000       Ken           Canada 

我想根据百分比用ProductAB填充C列。

我有另一个名为CountriesStats的表,如下所示

  Id        Country         A             B            C
+-----+---------------+--------------+-------------+----------+
  1          Canada          60            20           20
  2          Argentina       35            45           20
  3          China           40            10           50

此表格包含每种产品的人员百分比。例如,在加拿大,60%的人拥有产品A,20%拥有产品B,20%拥有产品C.

我想根据第二个数据中的百分比向Users表填充数据。例如,如果加拿大有100万用户,我想在“用户”表格中填入Product列的600000个A 200000 B和200000 C }

感谢您提供有关如何做到这一点的任何帮助。我不介意在多个步骤中执行它我需要提示如何在SQL中实现它

1 个答案:

答案 0 :(得分:2)

这背后的逻辑并不太难。为每个国家/地区的每个人分配一个顺序计数器。然后,使用此值,根据此值分配正确的产品。例如,在您的示例中,当数字小于或等于600,000时,则会分配“A”。 600,001到800,000然后'B',最后'C'到其余部分。

以下SQL实现了这一点:

with toupdate as (
      select u.*,
             row_number() over (partition by country order by newid()) as seqnum,
             count(*) over (partition by country) as tot
      from users u
     )
update u
    set product = (case when seqnum <= tot * A / 100 then 'A'
                        when seqnum <= tot * (A + B) / 100 then 'B'
                        else 'C'
                   end)
    from toupdate u join
         CountriesStats cs
         on u.country = cs.country;

with语句定义了一个可更新的子查询,其中包含每行上每个国家/地区的序列号和总计。这是SQL Server的一个很好的功能,但并不是所有数据库都支持。

from语句将加入CountriesStats表,以获取每个国家/地区所需的值。 case语句执行必要的逻辑。

请注意,序列号是使用newid()随机分配的,因此应通过初始表随机分配产品。