4

如果我有一组记录

name    amount    Code
Dave    2         1234
Dave    3         1234
Daves   4         1234

我希望它根据代码和名称进行分组,但最后一行的名称有错字,所以这不会分组。

将这些分组为:

Dave/Daves 9 1234

4

5 回答 5

6

作为一般规则,如果数据错误,您应该修复数据。

但是,如果您无论如何都想做报告,您可以提出另一个分组条件,例如 LEFT(Name, 4) 将对名称的前 4 个字符执行分组。

您可能还想将 CASE 语句视为一种方法(CASE WHEN name = 'Daves' THEN 'Dave' ELSE name),但我真的不喜欢这种方法,尤其是如果您打算将它用于其他任何事情时一次性报告。

于 2009-02-25T15:46:26.793 回答
5

如果这是一种解决方法,请尝试

SELECT cname, SUM(amount)
FROM (
  SELECT CASE WHEN NAME = 'Daves' THEN 'Dave' ELSE name END AS cname, amount
  FROM mytable
)
GROUP BY cname

这个 if 当然将只处理这个确切的情况。

于 2009-02-25T15:45:52.877 回答
1

修正错字?否则按名称分组将创建一个新组。

修复数据应该是您的首要任务,而不是试图设计“解决”它的方法。

还应该注意的是,如果您的数据中有这个拼写错误,那么您很可能拥有(或在未来某个时间点)甚至更多不适合您的代码的混乱数据,这将迫使您当您应该专注于数据的清洁度时,发明越来越多的“变通办法”来处理它。

于 2009-02-25T15:45:42.037 回答
1

对于 MySQL:

select
  group_concat(distinct name separator '/'),
  sum(amount),
  code
from
  T
group by
  code

对于 MSSQL 2005+,group_concat() 可以实现为 .NET 自定义聚合。

于 2009-02-25T16:01:09.363 回答
1

如果 name 字段被假设为一个键,那么假设必须是 Dave 和 Daves 是两个不同的项目,因此应该进行不同的分组。但是,如果这是一个错字,那么正如其他人所建议的那样,修复数据。

如果是这样,对自由格式输入的文本字段进行分组,总是会出现问题。数据输入永远不会是 100%。

对我来说,如果代码是关键字段并将名称完全排除在分组之外,那么单独对代码进行分组更有意义。

于 2009-02-25T16:09:06.927 回答