Excel单列差异多行合并为单行及SQL实现方案咨询
嘿,这个需求我之前刚好处理过,给你两种靠谱的方案,不管用Excel还是SQL都能搞定~
Excel 函数实现方案
假设你的原始数据在A1:C4(A列name,B列job,C列salary),可以按以下步骤操作:
- 提取唯一的姓名:在E2单元格输入公式
=UNIQUE(A:A),按回车后会自动生成去重后的name列表(这里就是sumit)。 - 拆分job到单独列:
- 在F2单元格(对应job1)输入公式:
=INDEX(B:B,SMALL(IF($A:$A=$E2,ROW($A:$A),""),COLUMN(A:A))) - 如果是Excel 2019及以后版本,直接回车即可;如果是旧版,需要按
Ctrl+Shift+Enter触发数组公式。 - 把F2的公式向右拖动到H2,就能得到job2、job3的内容。
- 在F2单元格(对应job1)输入公式:
- 提取对应薪资:在I2单元格输入公式
=XLOOKUP($E2,$A:$A,$C:$C,""),按回车就能获取sumit的薪资(因为同一name的薪资相同,XLOOKUP会返回第一个匹配值)。
如果你的数据量更大,job的数量不固定,也可以用 TEXTJOIN(",",TRUE,IF($A:$A=$E2,$B:$B,"")) 把所有job合并到一个单元格里,不过这样就不是拆分成多个列了,看你需求选择。
SQL 查询实现方案
假设你的数据存储在名为employee的表中,字段分别是name、job、salary,可以用行转列的思路来实现:
首先给每个name下的job编号,再通过CASE语句把行转成列,最后分组聚合:
SELECT name, MAX(CASE WHEN rn = 1 THEN job END) AS job1, MAX(CASE WHEN rn = 2 THEN job END) AS job2, MAX(CASE WHEN rn = 3 THEN job END) AS job3, MAX(salary) AS salary FROM ( SELECT name, job, salary, -- 给每个name下的job按顺序编号 ROW_NUMBER() OVER(PARTITION BY name ORDER BY job) AS rn FROM employee ) t GROUP BY name;
这里用ROW_NUMBER()给每个name的job排序,然后用CASE把不同编号的job放到对应的列里,最后GROUP BY name合并成一行。因为同一name的salary相同,用MAX(salary)或者MIN(salary)都能得到正确的薪资值。
内容的提问来源于stack exchange,提问作者batman




