求1SQL语句,按照频次排序
求一SQL语句,按照频次排序
目前有两个表:
表1:Source 用于记录每一单的客户名称和对应的操作人员,结构如下
订单编号 客户名称 操作员工
1 客户1 员工3
2 客户1 员工1
3 客户2 员工1
4 客户6 员工4
5 客户1 员工5
6 客户3 员工1
7 客户2 员工2
表2: workers 结构如下
人员编号 人员名字 员工归属 熟悉客户1 熟悉客户2 熟悉客户3
001 员工1 职工 NULL NULL NULL
002 员工2 职工 NULL NULL NULL
003 员工3 职工 NULL NULL NULL
004 员工4 临时工 NULL NULL NULL
005 员工5 职工 NULL NULL NULL
要实现如下要求:
1. 对于职工:熟悉客户1列自动填上表Source中该员工对应项目数最多的客户
熟悉客户2列自动填上表Source中该员工对应项目数第二多的客户
熟悉客户3列自动填上表Source中该员工对应项目数第三多的客户
如果没有则填上“无”
2. 对于临时工: 熟悉客户1列自动填上表Source中该员工对应项目数最多的客户,且项目数不少于3次,没有填上“无”
熟悉客户2列自动填上表Source中该员工对应项目数第二多的客户,且项目数不少于3次,没有填上“无”
熟悉客户2列自动填上表Source中该员工对应项目数第二多的客户,且项目数不少于3次,没有填上“无”
我写了个熟悉客户1的:
SELECT 人员编号,人员名字,员工归属,
(SELECT TOP (1) 客户名称
FROM Source
WHERE (workers.人员名字 = 操作员工)
GROUP BY 客户名称
ORDER BY COUNT(客户名称) DESC) AS 熟悉客户1, 熟悉客户2, 熟悉客户3,
FROM workers
只能实现1.1的要求,其它的如何实现,请各位大神教我!!!
------解决思路----------------------
都1点了还没睡...
目前有两个表:
表1:Source 用于记录每一单的客户名称和对应的操作人员,结构如下
订单编号 客户名称 操作员工
1 客户1 员工3
2 客户1 员工1
3 客户2 员工1
4 客户6 员工4
5 客户1 员工5
6 客户3 员工1
7 客户2 员工2
表2: workers 结构如下
人员编号 人员名字 员工归属 熟悉客户1 熟悉客户2 熟悉客户3
001 员工1 职工 NULL NULL NULL
002 员工2 职工 NULL NULL NULL
003 员工3 职工 NULL NULL NULL
004 员工4 临时工 NULL NULL NULL
005 员工5 职工 NULL NULL NULL
要实现如下要求:
1. 对于职工:熟悉客户1列自动填上表Source中该员工对应项目数最多的客户
熟悉客户2列自动填上表Source中该员工对应项目数第二多的客户
熟悉客户3列自动填上表Source中该员工对应项目数第三多的客户
如果没有则填上“无”
2. 对于临时工: 熟悉客户1列自动填上表Source中该员工对应项目数最多的客户,且项目数不少于3次,没有填上“无”
熟悉客户2列自动填上表Source中该员工对应项目数第二多的客户,且项目数不少于3次,没有填上“无”
熟悉客户2列自动填上表Source中该员工对应项目数第二多的客户,且项目数不少于3次,没有填上“无”
我写了个熟悉客户1的:
SELECT 人员编号,人员名字,员工归属,
(SELECT TOP (1) 客户名称
FROM Source
WHERE (workers.人员名字 = 操作员工)
GROUP BY 客户名称
ORDER BY COUNT(客户名称) DESC) AS 熟悉客户1, 熟悉客户2, 熟悉客户3,
FROM workers
只能实现1.1的要求,其它的如何实现,请各位大神教我!!!
------解决思路----------------------
都1点了还没睡...
SELECT T1.人员编号,T1.人员名字,T1.员工归属
,MAX(CASE WHEN T2.RN=1 THEN T2.客户名称 END)熟悉客户1
,MAX(CASE WHEN T2.RN=2 THEN T2.客户名称 END)熟悉客户2
,MAX(CASE WHEN T2.RN=3 THEN T2.客户名称 END)熟悉客户3
FROM workers T1
LEFT JOIN(
SELECT *
FROM(
SELECT 操作员工,客户名称,COUNT(1)C
,ROW_NUMBER()OVER(PARTITION BY 操作员工 ORDER BY COUNT(1) DESC)RN
FROM(
SELECT 客户名称,操作员工 FROM [Source]
UNPIVOT([操作员工]FOR [TYPE]IN([操作员工1],[操作员工2],[操作员工3]))U
)T
WHERE 操作员工 IS NOT NULL
GROUP BY 操作员工,客户名称
)CTE
WHERE RN<=3
)T2 ON T1.人员名字=T2.操作员工 AND(T1.员工归属='职工'
OR(T1.员工归属='临时工' AND T2.C>=3))
GROUP BY T1.人员编号,T1.人员名字,T1.员工归属
ORDER BY 人员编号