【发布时间】:2011-04-25 14:21:27
【问题描述】:
我需要根据以下规则从姓氏、名字、中间名首字母构建一个字符串:
- 如果姓氏是唯一的,只需 返回姓氏
- 如果最后 名称不是唯一的,而是第一个 名字的字母是唯一的, 返回姓氏+第一个字母 名字
- 如果姓氏和 名字的第一个字母是 不唯一,返回姓氏+ 名字的第一个字母+中间名 初始。
例如,表格可能是:
MDC MDLast MDFirst MDInit
3 Jones Fred A
21 Smith Sam D
32 Brown Tom E
42 Brown Ted A
55 Smith Al D
查询应该返回:
MDC MDFormattedName
3 Jones
21 Smith S
32 Brown TE
42 Brown TA
55 Smith A
我编写了一个几乎可以工作的查询,但它使用了多个嵌套查询,并且仍然需要更多的查询来(可能)制定一个可行的解决方案,而且效率很低。我确信有一种“正确”的方式来实现这一点(对于 SQL Server 2005,顺便说一句)。
这是我到目前为止所得到的。它不起作用,由于聚合,我丢失了 ID 无法进行最终连接以获取 ID/名称对。
select
CASE
WHEN CountLastFirst > 1 THEN
CASE WHEN MDInit IS NOT NULL THEN MDLastFirst + LEFT(MDInit,1) ELSE MDLastFirst END
WHEN CountLastFirst = 1 AND CountLast > 1 THEN MDLastFirst
ELSE MDLast
END as MDName
FROM
(
select x.MDLast, CountLast, MDLastFirst, CountLastFirst FROM
(
select MDLast,Count(MDLast) as CountLast FROM
MDList
GROUP BY MDLast) as x
INNER JOIN
(select MDLast, MDLastFirst,Count(MDLastFirst) as CountLastFirst FROM
(
select MDLast,
MDLast + ' ' + LEFT(MDFirst,1) as MDLastFirst
From MDList
) as a
GROUP BY MDLastFirst, MDLast) as y ON x.MDLast = y.MDLast
) as z
【问题讨论】:
标签: sql tsql concatenation