You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多
文档控制台
免费开始使用

Excel单列差异多行合并为单行及SQL实现方案咨询

嘿,这个需求我之前刚好处理过,给你两种靠谱的方案,不管用Excel还是SQL都能搞定~

Excel 函数实现方案

假设你的原始数据在A1:C4(A列name,B列job,C列salary),可以按以下步骤操作:

  1. 提取唯一的姓名:在E2单元格输入公式 =UNIQUE(A:A),按回车后会自动生成去重后的name列表(这里就是sumit)。
  2. 拆分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的内容。
  3. 提取对应薪资:在I2单元格输入公式 =XLOOKUP($E2,$A:$A,$C:$C,""),按回车就能获取sumit的薪资(因为同一name的薪资相同,XLOOKUP会返回第一个匹配值)。

如果你的数据量更大,job的数量不固定,也可以用 TEXTJOIN(",",TRUE,IF($A:$A=$E2,$B:$B,"")) 把所有job合并到一个单元格里,不过这样就不是拆分成多个列了,看你需求选择。

SQL 查询实现方案

假设你的数据存储在名为employee的表中,字段分别是namejobsalary,可以用行转列的思路来实现:

首先给每个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

火山引擎 最新活动