SQL连接用于重复记录

时间:2018-07-26 19:58:32

标签: sql pivot

我有两个桌子。一个带有静态信息(用户ID,用户名,Dob,村庄)的表。第二个表包含可变信息(用户ID,favourite_food)。一个用户可以吃几种喜欢的食物。

我想将两个表连接起来以输出而不重复记录。最喜欢的食物应该放在大面包里,但是每个用户的数量可以变化。

示例 表1

x86

表2

userid  usernames   dob     village
2001    wallace 1963    olu
2002    John    1975    remba
2003    Maurice 1954    goro
2004    Patrick 1932    goro
2005    Emma    2000    chula
2006    Mary    1989    remba
2007    Anne    2001    sakwa
2008    Moses   1994    remba
2009    Agatha  1956    sori

预期产量

userid  favourite_food
2001    fries
2002    rice
2003    potatoes
2004    chicken
2004    beef
2005    mutton
2001    pork
2003    chapati
2004    dhal
2006    fries
2007    carrot
2008    lamb
2009    bread
2009    corn

注意:目前尚无已知方法可以知道喜欢的食物的数量,也没有最大值。对于每个附加项,输出中应有一列。

我该怎么做?

2 个答案:

答案 0 :(得分:1)

您没有说您正在使用哪个数据库。我在这里看到两个选择。要么你:

  • 像在SQL Server中一样生成数据透视表,或
  • 按人分组,并使用LISTAGG()函数汇总最喜欢的食物列来生成一个“最喜欢的食物”列。

答案 1 :(得分:0)

您在寻找我们的“数据”数据。您可以在Stackoverflow的此处找到答案:

SQL Server:How to pivot text columns in SQL Server?

MySql:

Select AA.uname,
 max(case when nr=1 then ffood end) ff1,
 max(case when nr=2 then ffood end) ff2,
 max(case when nr=3 then ffood end) ff3,
 max(case when nr=4 then ffood end) ff4
FROM  (select BB.*,@rownum := case when buid=@lu then @rownum else 0 end + 1 as nr,
   @lu:=buid
   FROM BB,(SELECT @lu := 0, @rownum :=0) r order by buid) P
INNER JOIN AA ON auid=buid
GROUP BY auid

使用Mysql做枢纽并不是很复杂,但是,在这种情况下,我们还需要为各种喜欢的食物生成一个“行号”。在SQL Server中,您可以找到一个函数,而我们需要使用用户定义的变量和MySQL中的case子句来实现相同的功能(列nr)。

这是一个小演示: http://rextester.com/JDA89035