我有两个表A和B:
表-A-代表人员的基本信息
emp_id | email | name
----------------------------------------
1 | abc@gmail.com | john
2 | dbc@gmail.com | john1
3 | cbc@gmail.com | john2
4 | xbc@gmail.com | john3
5 | xac@gmail.com | john4
表-B代表人员处理的位置
john正在处理Region和Zone john1正在处理Area和Territory等……
locationType的顺序如下:Region-> Zone-> Area-> Territory 区域的优先级更高,然后是区域,等等。
id | emp_id | locationType
--------------------
1 | 1 | Region
2 | 2 | Area
3 | 3 | Area
4 | 4 | Territory
5 | 1 | Zone
6 | 2 | Territory
7 | 5 | Zone
8 | 5 | Area
我想获取处理更高locationType的人员。 假设john正在处理Region和zone,所以我想显示Region为Region的优先级更高,而john1正在处理Territory和Area,所以我只想显示Area,因为Area的优先级更高
我想要的输出:
id | emp_id | name | locationType
----------------------------------------
1 | 1 | john | Region
5 | 5 | john4 | Zone
3 | 3 | john1 | Area
4 | 4 | john2 | Area
4 | 4 | john3 | Territory
我得到的是
id | emp_id | name | locationType
----------------------------------------
1 | 1 | john | Region
1 | 1 | john | Zone
5 | 5 | john4 | Zone
5 | 5 | john4 | Area
2 | 2 | john1 | Area
3 | 3 | john2 | Area
4 | 4 | john3 | Territory
4 | 4 | john3 | Territory
答案 0 :(得分:2)
您可以使用field()
将位置转换为数字。您想要的是基于此顺序的最小位置。
您可以使用相关子查询为每位员工获取此信息:
select b.*
from b
where field(b.locationType, 'Region', 'Zone', 'Area', 'Territory') =
(select min(field(b2.locationType, 'Region', 'Zone', 'Area', 'Territory'))
from b b2
where b2.emp_id = b.emp_id
);
从a
中添加额外的列只是加入表中的问题。
答案 1 :(得分:0)
在订单子句中使用case when
order by (case locationType when 'Region' then 1
when 'Zone' then 2
when 'Area' then 3
when 'Territory' then 4
else 5 end )
答案 2 :(得分:0)
要永久解决此问题,请执行以下步骤。它还将帮助您进行数据标准化。
1创建一个具有LocaitonType名称和ID的新表,并按所需顺序插入您的位置类型。
CREATE TABLE [dbo].[Table_C](
[LocationType_Id] [int] IDENTITY(1,1) NOT NULL,
[name] [nvarchar](50) NULL )
Insert Into [Table_C] (name) values('Region')
Insert Into [Table_C] (name) values('Zone')
Insert Into [Table_C] (name) values('Area')
Insert Into [Table_C] (name) values('Territory')
2。更改表b LocationType 列将数据类型转换为int。
Alter Table Table_B
Alter column locationType int not null
从Table_A.emp_id = Table_B.emp_id上的Table_B内部联接Table_A中选择Table_B.id,Table_A.emp_id,Table_A.name,Table_C.name作为locationType Table_C.LocationType_Id = Table_B.locationType上的内部联接Table_C 按Table_C.LocationType_Id
排序