在SQL查询中自定义重复记录
考虑到MS AccessSQL查询中的两列,我想自定义重复的行 1如果任何教师的PrivateName不同,则仅取PrivateName。 2若任何教师的姓名相同,则取姓氏的第一个字母ConcatPrivateName。 3若结果仍然包含相同的教师姓名,则为ConcatePrivateName,LastName 我用以下数据命名了TBLTachers表在SQL查询中自定义重复记录,sql,ms-access,Sql,Ms Access,考虑到MS AccessSQL查询中的两列,我想自定义重复的行 1如果任何教师的PrivateName不同,则仅取PrivateName。 2若任何教师的姓名相同,则取姓氏的第一个字母ConcatPrivateName。 3若结果仍然包含相同的教师姓名,则为ConcatePrivateName,LastName 我用以下数据命名了TBLTachers表 TeacherID PrivateName LastName 1 aa 1 2
TeacherID PrivateName LastName
1 aa 1
2 b 2
3 c 3
4 d 4
5 e 5
6 ab 6
7 g 7
8 h 8
9 i 9
10 aa 10
11 j 11
12 k 12
13 l 13
14 m 14
15 n 15
16 o 16
17 p 17
18 q 18
19 r 19
20 b 20
我希望以下内容作为输出:
TeacherID TeacherName
1 aa 1
2 b 2
3 c
4 d
5 e
6 ab 6
7 g
8 h
9 i
10 aa 10
11 j
12 k
13 l
14 m
15 n
16 o
17 p
18 q
19 r
20 b 20
联接到一个子查询,该子查询查找每个私有名称的发生次数。如果不止一名教师使用了私人姓名,则将姓氏附加到私人姓名后作为输出
SELECT
t1.TeacherID,
IIF(t2.cnt > 1, t1.PrivateName & " " & STR(t1.LastName), t1.PrivateName) AS TeacherName
FROM yourTable t1
INNER JOIN
(
SELECT PrivateName, COUNT(*) AS cnt
FROM yourTable
GROUP BY PrivateName
) t2
ON t1.PrivateName = t2.PrivateName
ORDER BY
t1.TeacherID;
如果我理解正确的话,蒂姆的回答是非常好的。另一种可能具有更好性能的编写方法是:
select t.TeacherID,
iif( exists (select 1
from t as t2
where t2.PrivateName = t.PrivateName and
t2.TeacherId <> t.teacherId
),
t.PrivateName & " " & str(t1.LastName),
t.PrivateName
) as TeacherName
from t
order by t.TeacherID;
特别是exists可以利用名称TeacherId上的索引