我希望有人可以帮助我。我有一份报告,将由一个salesrep,一个区域销售经理(有几个销售报告给他)和“全部”经理人运行,他们应该能够看到所有的销售报告。如果用户是销售额,他应该只能看到分配给他的客户;如果用户是区域经理,他应该看到他的客户以及分配给他管理的销售代表的所有其他客户;并且“全面”经理应该能够看到每一个销售代表及其所有客户。
我们有一个salesrep表(SALESMAN_MSID),它有salesrep#,他们的MSID值,他们的区域经理rep#,以及他们的用户类型 - “S”表示他们是salesrep,“R”表示他们是区域经理,“M”表示他们是全职经理。这是我到目前为止的查询:
select distinct s.slsm_num, s.slsm_desc
from salesman s
where
s.slsm_num in (select distinct slsm_num
from salesman_msid
where slsm_mgr_id = (@SlsmnRealNum))
or (s.slsm_num = (@SlsmnRealNum))
order by s.slsm_desc
如果用户是salesrep或Reg Mgr,这很有效,但我无法弄清楚如何编写sql以使所有结果都能正常工作。参数“@SlsmnRealNum”中的值是它们的实际salesrep#。
SALESMAN_MSDI表中的值如下:
Slsm_num MSID Slsm_mgr_id User_Type
------------------------------------------------------
1379 ljones 1316 S
1316 pcuday 1316 R
1401 mmay M
如果我在“或user_type ='M'中添加条款,无论我是作为S还是R进行测试,我都会得到所有代表。
任何人都可以帮助SQL语句让“M”返回除了其他2之外的其他所有内容吗?
ETA:这是新的sql语句(在我的评论中无法适应它?) - 再次感谢@Sklivvz!
选择DISTINCT S.SLSM_NUM,S.SLSM_DESC来自SALESMAN S,其中S.SLSM_NUM IN(SELECT DISTINCT M.slsm_num
来自SALESMAN_MSID M.
在哪里M.slsm_num =(@SlsmnRealNum) - 自己
或者(m.slsm_mgr_id =(@SlsmnRealNum)和EXISTS - 如果是R型,他们的下属
(选择1
来自SALESMAN_MSID m
WHERE m.slsm_num =(@SlsmnRealNum)
AND m.User_Type ='R'))
或EXISIS(选择1 - 如果键入M,则为每个人
来自SALESMAN_MSID M.
WHERE m.slsm_num =(@SlsmnRealNum)
AND m.USER_TYPE ='M'))s.slsm_desc的排序enter code here
答案 0 :(得分:1)
您需要对表进行子查询以区分类型:
SELECT DISTINCT slsm_num, slsm_desc
FROM salesman
WHERE slsm_num = @SlsmnRealNum --Themselves
OR (slsm_mgr_id = @SlsmnRealNum AND EXISTS -- Their subordinates if type R
(
SELECT 1
FROM salesman
WHERE slsm_num = @SlsmnRealNum
AND User_Type = 'R'
)
)
OR EXISTS ( -- Everyone if type M
SELECT 1
FROM salesman
WHERE slsm_num = @SlsmnRealNum
AND User_Type = 'M'
)