我有一个包含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
答案 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。编写查询时,您需要指定列列表。您的选择是:
如果您事先知道列数,则@ZaynulAbadinTuhin解决方案会更容易。看来,这不是您的情况。
如果您不知道预先知道的列数,并且希望将它们全部合并在一个列中,那么@Rick James解决方案是最好的。
否则,您仍然可以在应用程序或存储过程中使用某种动态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;
答案 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