按自定义条件对值排序

kwvwclae  于 2021-06-18  发布在  Mysql
关注(0)|答案(3)|浏览(400)

我有两张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表示人员处理的位置
约翰是处理地区和区域约翰尼是处理地区和领土等。。。
位置类型的顺序如下:区域->区域->区域->区域优先于区域,以此类推。。

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

我想把那些负责高级职位的人找来。假设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
n8ghc7c1

n8ghc7c11#

要立即解决问题,只需执行以下步骤。它还将帮助您实现数据规范化。
1创建一个具有locaitontype name和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

现在将表c中的id插入表b的locationtype列。并使用下面的查询获得所需的输出。
从表\u a上的表\u b内部联接表\u a中选择表\u b.id、表\u a.emp \u id、表\u a.name、表\u c.name作为locationtype。emp \u id=table \u b.emp \u id inner join table \u c on table \u c。locationtype \u id=table \u b.locationtype按表\u c.locationtype \u id排序

smdncfj3

smdncfj32#

你可以用 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 只是一个加入谈判桌的问题。

fcy6dtqo

fcy6dtqo3#

使用 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 )

相关问题