如果我有一组记录
name amount Code
Dave 2 1234
Dave 3 1234
Daves 4 1234
我希望它根据代码和名称进行分组,但最后一行的名称有错字,所以这不会分组。
将这些分组为:
Dave/Daves 9 1234
作为一般规则,如果数据错误,您应该修复数据。
但是,如果您无论如何都想做报告,您可以提出另一个分组条件,例如 LEFT(Name, 4) 将对名称的前 4 个字符执行分组。
您可能还想将 CASE 语句视为一种方法(CASE WHEN name = 'Daves' THEN 'Dave' ELSE name),但我真的不喜欢这种方法,尤其是如果您打算将它用于其他任何事情时一次性报告。
如果这是一种解决方法,请尝试
SELECT cname, SUM(amount)
FROM (
SELECT CASE WHEN NAME = 'Daves' THEN 'Dave' ELSE name END AS cname, amount
FROM mytable
)
GROUP BY cname
这个 if 当然将只处理这个确切的情况。
修正错字?否则按名称分组将创建一个新组。
修复数据应该是您的首要任务,而不是试图设计“解决”它的方法。
还应该注意的是,如果您的数据中有这个拼写错误,那么您很可能拥有(或在未来某个时间点)甚至更多不适合您的代码的混乱数据,这将迫使您当您应该专注于数据的清洁度时,发明越来越多的“变通办法”来处理它。
对于 MySQL:
select
group_concat(distinct name separator '/'),
sum(amount),
code
from
T
group by
code
对于 MSSQL 2005+,group_concat() 可以实现为 .NET 自定义聚合。
如果 name 字段被假设为一个键,那么假设必须是 Dave 和 Daves 是两个不同的项目,因此应该进行不同的分组。但是,如果这是一个错字,那么正如其他人所建议的那样,修复数据。
如果是这样,对自由格式输入的文本字段进行分组,总是会出现问题。数据输入永远不会是 100%。
对我来说,如果代码是关键字段并将名称完全排除在分组之外,那么单独对代码进行分组更有意义。