Как заменить мужское и женское в SQL Server - PullRequest
2 голосов
/ 23 марта 2019

У меня вопрос по SQL Server: как получить альтернативные данные о мужских и женских данных

CREATE TABLE [dbo].[EmpGenders]
(
    [id] [INT] NULL,
    [Name] [VARCHAR](50) NULL,
    [Gender] [VARCHAR](50) NULL
) 

INSERT INTO [dbo].[EmpGenders] ([id], [Name], [Gender]) 
VALUES (1, N'Manish', N'Male'), (2, N'Nayak', N'Male'),
       (3, N'Martin', N'Male'), (4, N'Roy', N'Male'),
       (5, N'Hardik', N'Male'), (6, N'Manisha', N'Female'),
       (7, N'Kruti', N'Female'), (8, N'Maria', N'Female')

На основании приведенных выше данных я хочу вывод, подобный этому:

Id | Name    | Gender 
---+---------+---------
1  | Manish  | Male
6  | Manisha | Female
2  | Nayak   | Male
7  | Kruti   | Female
3  | Martin  | Male
8  | Maria   | Female
4  | Roy     | Male
5  | Hardik  | Male 

Я попробовал этот оператор SQL:

select 
    id, name, gender  
from 
    (select 
         *,
         row_number() over (order by id, gender) as rn
     from  
         [Test].[dbo].[EmpGenders]) a
where  
    rn % 2 = 1 

union all

select 
    id, name, gender  
from 
    (select 
         *, row_number() over (order by id desc, gender desc) as rn
     from  
         [Test].[dbo].[EmpGenders]) a  
where  
    rn % 2 = 0

но этот запрос не возвращает ожидаемый результат.

Подскажите, пожалуйста, как написать запрос для выполнения этой задачи в SQL Server?

Ответы [ 2 ]

5 голосов
/ 23 марта 2019

Не могли бы вы просто сделать ...

SELECT *
FROM EmpGenders
ORDER BY ROW_NUMBER() OVER(PARTITION BY Gender ORDER BY Id),
         Gender DESC;
1 голос
/ 23 марта 2019

Добавьте еще 1 столбец к каждому подзапросу, например, num = 0 or 1 для каждого пола:

select id, name, gender from (
  select * ,row_number()over ( order by id )as rn, 0 as num
  from  [EmpGenders]
  where gender = 'Male'
  union all
  select * ,ROW_NUMBER()over ( order by id )as rn, 1 as num
  from  [EmpGenders] 
  where gender = 'Female'
  ) t
order by t.rn, t.num

См. Демоверсию Примечание: Ответ Ларну, который был удален (!!!), лучше ....

...