Упорядочение значений по пользовательским критериям - PullRequest
0 голосов
/ 25 сентября 2018

У меня есть две таблицы 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 представляет местоположения, обрабатываемые людьми

Джон обрабатывает область, а зона Джон1 обрабатывает область и территорию и т. д. ...

Последовательность locationType выглядит следующим образом: Регион-> Зона-> Область-> Территория Регионы имеют более высокий приоритет, чем зона.и так далее ..

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.Предположим, что Джон обрабатывает регион и зону, поэтому я хочу отобразить регион, так как регион имеет более высокий приоритет, и аналогично Джон обрабатывает территорию и район, поэтому я хочу отображать только область, поскольку область имеет более высокий приоритет

Мой желаемый вывод:

 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

Ответы [ 3 ]

0 голосов
/ 25 сентября 2018

Вы можете использовать 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 - это простоДело о присоединении в таблице.

0 голосов
/ 25 сентября 2018

Чтобы устранить проблему, выполните следующие действия.Это также поможет вам в нормализации данных.

1 Создайте новую таблицу с именем и идентификатором LocaitonType и вставьте тип местоположения в нужном порядке.

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
Теперь вставьте id из Table_c в столбец Тип_таблицы Table_B.и используйте приведенный ниже запрос для получения желаемого результата.

Выберите Table_B.id, Table_A.emp_id, Table_A.name, Table_C.name в качестве locationType из внутреннего соединения Table_B Table_A для Table_A.emp_id = Table_B.emp_id внутреннее соединение

0 голосов
/ 25 сентября 2018

используйте 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 )
...