如何将此表从行转换为列?

时间:2019-07-01 17:33:40

标签: mysql sql pivot-table

我有一个包含ID和国家/地区名称的表,我需要对其进行转换,以便具有1个以上国家/地区的ID将显示在1行中。我在该论坛中搜索一个多小时没有发现任何结果。

我尝试过使用透视功能是否可以帮助我达到所需的结果,但是我觉得在这里无法使用透视功能。

这是我的桌子的迷你版。 “国家/地区”字段中的唯一值的数量将超过100,因此我只能说出County ='..'之类的话,因为这将是重复的。

enter code here
 +----+--------+
| id | country|
+----+--------+
| 1  | US     |
| 1  | UK     |
| 2  | JP     |
+----+--------+

我想要的期望结果:

enter code here

+----+-----------+-----------+
| id | country_1 | country_2 |
+----+-----------+-----------+
| 1  | US        |   UK      |
| 2  | JP        |   null    |
+----+-----------+-----------+

我发现了类似的问题,但与我试图解决的问题相反。

MySQL statement to pivot table without using pivot function or a union


++++++++++++++++++++++++++++++++++++++++++++++++ +++++++++++++++++++++++++++++ 更新:

非常感谢您提供的所有帮助。我可能没有使用您的查询来解决我的问题-因为语法在雪花中有点差异。但是,我从所有人中都得到了我需要的见解。

这是我的解决方法:

enter code here
select t1.id,
max(iff(t1.row_number = 1, t1.country ,null)) as country_1,
max(iff(t1.row_number = 2, t1.country ,null)) as country_2,
max(iff(t1.row_number = 3, t1.country, null)) as country_3
from
(
  select id, country, row_number() over (partition by id order by id ) as 
row_number
  from table
) t1
group by t1.id

5 个答案:

答案 0 :(得分:3)

您可以通过“透视”来实现,但是当您有3个国家/地区时会发生什么?还是4?还是17?

我可以这样建议吗?

SELECT id,
       GROUP_CONCAT(country)
    FROM tbl
    GROUP BY id;

您将得到类似的东西:

1   US,UK
2   JP

答案 1 :(得分:2)

使用聚合

 select id, max(case when id=1 then country end ) as country_1,
 max(case when id=2 then country end ) as country_2
 from tbale group by id

答案 2 :(得分:1)

SQL中没有“动态” PIVOT。编写查询时,您需要指定列列表。您的选择是:

  1. 如果您事先知道列数,则@ZaynulAbadinTuhin解决方案会更容易。看来,这不是您的情况。

  2. 如果您不知道预先知道的列数,并且希望将它们全部合并在一个列中,那么@Rick James解决方案是最好的。

  3. 否则,您仍然可以在应用程序或存储过程中使用某种动态SQL,这些动态SQL将基于表的现有值在运行时构建SQL查询。但是这种解决方案将需要更多的编程。它不再是单个/简单的SQL查询。请参阅Rick James's Pivoting in MySQL存储过程。

答案 3 :(得分:1)

在@Rick答案上发表评论时,每个ID最多可包含3个国家/地区,然后您就可以使用此

select 
id,
(select country from test  where test.id=t.id limit 0,1)as country_1,
(select country from test where test.id=t.id limit 1,1)as country_2,
(select country from test where test.id=t.id limit 2,1)as country_3
from test as t
group by id;

DEMO

答案 4 :(得分:1)

您可以尝试下面的脚本,其中每个ID都会生成RowNumber。如您所确认,每个ID最多可包含3个国家/地区,我们可以通过处理RowNumber 1,2&3

轻松生成您想要的结果集
SELECT ID,
MAX(CASE WHEN RowNumber = 1 THEN country ELSE NULL END) Country_1,
MAX(CASE WHEN RowNumber = 2 THEN country ELSE NULL END) Country_2,
MAX(CASE WHEN RowNumber = 3 THEN country ELSE NULL END) Country_3
FROM
(
    SELECT id, 
    country,
    @row_num :=IF(@prev_value = concat_ws('',id),@row_num+1,1)AS RowNumber
    ,@prev_value := concat_ws('',id)
    FROM tbale
    ORDER BY id
)A 
GROUP BY id