2012-02-21 3 views
3

У меня есть одна таблица с пол как один из столбцов. В гендерном столбце допускаются только M или F. Теперь я хочу сортировать таблицу так, чтобы при отображении таблицы в поле gender M и F будет поступать alternetivly.Кому вставлять данные в строки ODD/EVEN только в SQL

Я пробовал .... Я попытался создать один (новый) стол с той же структурой, что и существующая таблица. Теперь, используя высокую левую вставку, я хочу вставить M в нечетные строки и F в четные строки. После этого я хочу присоединиться к этим двум утверждениям, используя оператор union. Я могу вставить в (новую) таблицу только для мужчин или женщин, но не для четных или нечетных рядов ... Может ли любой орган помочь мне в этом отношении ....

Спасибо в Advance ....

+1

Какую базу данных вы используете? –

ответ

3

Не сочтите таблица будет «отсортированный». SQL-сервер может возвращать строки в любом порядке в зависимости от плана выполнения, индекса, объединений и т. Д. Если вам нужен строгий порядок, вам нужно иметь упорядоченный столбец, например столбец идентификатора. Обычно при выборе данных лучше применять желаемую сортировку.

Однако чередование M и F немного сложнее, вам нужно использовать функцию ROW_NUMBER.

Действительный код SQL Server:

CREATE TABLE #GenderTable(
    [Name] [nchar](10) NOT NULL, 
    [Gender] [char](1) NOT NULL 
) 

-- Create sample data 
insert into #GenderTable (Name, Gender) values 
('Adam',  'M'), 
('Ben',   'M'), 
('Casesar',  'M'), 
('Alice',  'F'), 
('Beatrice', 'F'), 
('Cecilia',  'F') 

SELECT * FROM #GenderTable 

SELECT * FROM #GenderTable 
order by ROW_NUMBER() over (partition by gender order by name), Gender 


DROP TABLE #GenderTable 

Это дает выходной сигнал

Name  Gender 
Adam  M 
Ben   M 
Casesar  M 
Alice  F 
Beatrice F 
Cecilia  F 

и

Name  Gender 
Alice  F 
Adam  M 
Beatrice F 
Ben   M 
Cecilia  F 
Casesar  M 

Если вы используете другой СУБД синтаксис может отличаться.

+0

В этом случае ему нужно будет написать число операторов вставки N в этом случае, что не является возможным решением для больших наборов данных ... –

+0

Я не думаю, что для этого нужны какие-либо вставки, он просто делает эти вставки, чтобы заполнить данные, которые OP уже имеет. Это довольно элегантное решение, которое возможно с SQL Server (с использованием раздела), но становится немного более сложным с MySQL –

+0

@mattedgod да, вы правы. Но я думаю, что создание временной таблицы только увеличило путаницу. Он должен был пойти с оригинальным (любым предполагаемым) именем таблицы, чтобы иметь более четкую точку зрения :) Хорошее решение, BTW ... –

0

Если вы используете SQL Server, вы можете разделить ваши две таблицы на столбец IDENTITY следующим образом. Сделайте один нечетный и один четный, а затем объединяйтесь и сортируйте по этому столбцу.

Обратите внимание, что вы можете только по-настоящему чередовать, если имеется одинаковое количество мужских и женских записей. Если их больше, чем других, в конце вы получите непеременные строки.

CREATE TABLE MaleTable(Id INT IDENTITY(1,2) NOT NULL, Gender CHAR(1) NOT NULL) 
INSERT INTO MaleTable(Gender) SELECT 'M' 
INSERT INTO MaleTable(Gender) SELECT 'M' 
INSERT INTO MaleTable(Gender) SELECT 'M' 

CREATE TABLE FemaleTable(Id INT IDENTITY(2,2) NOT NULL, Gender CHAR(1) NOT NULL) 
INSERT INTO FemaleTable(Gender) SELECT 'F' 
INSERT INTO FemaleTable(Gender) SELECT 'F' 
INSERT INTO FemaleTable(Gender) SELECT 'F' 

SELECT u.Id 
     ,u.Gender 
    FROM (
     SELECT Id, Gender 
      FROM FemaleTable 
     UNION 
     SELECT Id, Gender 
      FROM MaleTable 
     ) u 
ORDER BY u.Id ASC 

См here для рабочего примера

+0

В этом случае ему нужно будет написать 'N' число операторов вставки, что не очень хорошее решение ... –

+0

Здесь, в приведенном выше случае, мне нужно создать две таблицы write? – Jitu

+0

Но у меня уже есть таблица, у которой есть данные, я просто хочу получить данные в определенном формате. – Jitu

2

Я думаю, что лучший способ сделать это - иметь два запроса (один для M, один для F), а затем объединить их. Уловкой будет то, что вам придется вычислять «ранг» каждого запроса, а затем сортировать соответственно.

Что-то вроде следующего должен делать то, что вам нужно:

select * from 
(select 
    @rownum:[email protected]+1 rank, 
    t.* 
from people_table t, 
    (SELECT @rownum:=0) r 
where t.gender = 'M' 
union 
select 
    @rownum:[email protected]+1 rank, 
    t.* 
from people_table t, 
    (SELECT @rownum:=0) r 
where t.gender = 'F') joined 
order by joined.rank, joined.gender; 
+0

почему-то я предполагал, что это mysql, я не знаю почему. Если это не так, нет гарантий, что этот метод «ранжирования» строк будет работать –

Смежные вопросы