SQL查询实现单分行数据展示求助
嘿,我明白你现在的困扰——数据已经有眉目了,但就是没法把同一分支的数据合并成单行,用了GROUP BY和DISTINCT ON都没达到预期效果对吧?而且你也说了,Barnet分支因为有两个秘书,保留两行是没问题的,其他分支要尽量合并成一行。
先说说你当前SQL的问题:你把Branch,Region,Treasure,Secretary,President,Role_Status所有字段都放进GROUP BY里了,这意味着只要这些字段里有任何一个值不一样,就会生成新的行。这就是为什么你没法得到单行结果的原因。
那怎么调整呢?核心思路是只按需要区分行的字段分组——也就是Branch、Region和Secretary(因为Secretary是唯一允许同一分支有多行的字段),其他字段用聚合函数来合并同一分组下的值。给你两个可行的方案:
方案1:假设同一分支下Treasure、President等字段值唯一
如果你的数据里,同一个Branch下的Treasure、President、Role_Status都是唯一的,那用MAX或者MIN聚合函数就能把它们合并到单行:
SELECT Branch, Region, MAX(Treasure) AS Treasure, Secretary, MAX(President) AS President, MAX(Role_Status) AS Role_Status FROM #branchhealth GROUP BY Branch, Region, Secretary ORDER BY Branch;
这样一来,Barnet分支因为有两个不同的Secretary会保留两行,其他分支只要Secretary唯一,就会合并成单行。
方案2:如果部分字段可能有多个值
要是同一分支下某些字段(比如Treasure)可能存在多个不同值,不想丢失数据的话,可以用字符串拼接的聚合函数(比如SQL Server的STRING_AGG,PostgreSQL的STRING_AGG或者MySQL的GROUP_CONCAT):
SELECT Branch, Region, STRING_AGG(DISTINCT Treasure, ', ') AS Treasure, Secretary, STRING_AGG(DISTINCT President, ', ') AS President, STRING_AGG(DISTINCT Role_Status, ', ') AS Role_Status FROM #branchhealth GROUP BY Branch, Region, Secretary ORDER BY Branch;
这个方法会把同一分组下的多个值用逗号拼接起来,既保证了单行展示,又不会丢失数据。
你可以根据自己的实际数据情况选其中一个方案试试,应该就能得到你想要的结果啦!
备注:内容来源于stack exchange,提问作者Biswanath Das

