Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 2008.08.03;
Скачать: [xml.tar.bz2];

Вниз

Вывод мужских и женских имен. Oracle   Найти похожие ветки 

 
Игорь Шевченко ©   (2008-02-21 00:38) [0]

Имеется таблица с двумя полями
NAME VARCHAR2(20)
GENDER CHAR(1) -- "F","M"

Не могу понять, как вывести, чтобы женское имя чередовалось с мужским и имена были отсортированы по алфавиту внутри пола.
Требуется список такого вида:
Алла
Алексей
Анна
Александр
....

Мужских и женских имен поровну.


 
Evgeny V ©   (2008-02-21 07:35) [1]

пусть таблица называется Pepople, тогда в
MSSQL 2005 примерная идея такая ( так как оракла нет под рукой)

select Name,Gender,RN FROM
(select Name,Gender,ROW_NUMBER() OVER (ORDER BY Name) as RN from People where Gender="M") as M
WHERE RN in (select DISTINCT NUM FROM (select (ROW_NUMBER() OVER (ORDER by Name)/2)+1 as NUM FROM People) PN)
UNION
select Name,Gender,RN FROM
(select Name,Gender,ROW_NUMBER() OVER (ORDER BY Name) as RN from People where Gender="F") as M
WHERE RN in (select DISTINCT NUM FROM (select (ROW_NUMBER() OVER (ORDER by Name)/2)+1 as NUM FROM People) PN)
order by RN,Gender

Заменим ROW_NUMBER на оракловский rownum и возможно прийдется еще посмотреть сортировку по именам в каждом внутреннем запросе из People....

Вводится псевдо столбец RN, номер записи в запросе по женщинам и мужчинам (запросы по женщинам и мужчинам должны быть отсортированы по именам). Тогда выбираем по возрастанию RN и с сортировкой по Gender

Так как много запросов типа slect from select, то выглядит довольно монстрообразно, да еще in используется, некрасиво одним словом. Но сразу сообразить не могу, как упростить.Наверняка можно проще, но непомню уже Оракл и не большой спец в SQL вообще, посмотреть доку и запрос для Оракла смогу только дома вечером, если никто не подскажет за день, что-то более удобоваримое, то может завтра дам результат попроще


 
sniknik ©   (2008-02-21 08:24) [2]

не оракл, но ради идеи.

я бы сделал так (ввиду того что в 2000-ном MSSQL отсутствует ROW_NUMBER, да и по скорости должно быть быстрее хотя и букв в пакете больше...)
CREATE TABLE [ #Fem] (ID INT Identity(1, 2), Name VarChar(50), Pol Char(1))
CREATE TABLE [ #Men] (ID INT Identity(2, 2), Name VarChar(50), Pol Char(1))

INSERT INTO #Fem SELECT Name,Pol FROM Piople WHERE Pol="F"
INSERT INTO #Men SELECT Name,Pol FROM Piople WHERE Pol="M"

SELECT * FROM #Fem
UNION
SELECT * FROM #Men
ORDER BY ID

DROP TABLE #Men
DROP TABLE #Fem


ORDER BY ID тут кстати лишний, т.к. UNION без ALL и так неявно отсортирует, но пишу всегда явно для наглядности (и на случай если изменения внутри делаю, например после тот же ALL понадобится добавить)

> Мужских и женских имен поровну.
это в принципе неважно, перемешает пока есть что перемешивать, дальше пойдет чтото "сплошняком".


 
sniknik ©   (2008-02-21 08:27) [3]

а, да, в INSERT перед "вносом" имен надо тоже добавить сортировку "по вкусу"

INSERT INTO #Fem SELECT Name,Pol FROM Piople WHERE Pol="F" ORDER BY xxxx

чтобы имена появлялись именно в таком порядке.


 
Sergey13 ©   (2008-02-21 08:29) [4]

А обязательно запросом?


 
sniknik ©   (2008-02-21 08:31) [5]

> А обязательно запросом?
так это же проще всего...


 
Sergey13 ©   (2008-02-21 08:51) [6]

> [5] sniknik ©   (21.02.08 08:31)
> так это же проще всего...

Что ж ты не написал решения? В [2] это скрипт, фактичекски несохраненная ХП или неименованный PL/SQL блок в терминологии оракла.


 
Johnmen ©   (2008-02-21 09:40) [7]

Истина где-то рядом (с):
SELECT rownum, GENDER, NAME FROM
 (SELECT * FROM Table ORDER BY NAME)
 WHERE GENDER="F"
UNION
SELECT rownum, GENDER, NAME FROM
 (SELECT * FROM Table ORDER BY NAME)
 WHERE GENDER="M"


 
Игорь Шевченко ©   (2008-02-21 09:53) [8]

Evgeny V ©   (21.02.08 07:35) [1]

Большое спасибо за идею :)

Sergey13 ©   (21.02.08 08:29) [4]


> А обязательно запросом?


Ага.

Johnmen ©   (21.02.08 09:40) [7]

да, примерно так и вышло

select rownum r,name,gender from
(select name,gender from work_names where sex = "F" order by name)
union all
select rownum,name,gender from
(select name,gender from work_names where sex = "M" order by name)
order by r,gender
/


 
Johnmen ©   (2008-02-21 10:03) [9]


> Игорь Шевченко ©   (21.02.08 09:53) [8]

Если не сложно, проверь, как будет с [7]. Мне просто стало интересно...:)


 
Sergey13 ©   (2008-02-21 10:10) [10]

> [9] Johnmen ©   (21.02.08 10:03)

Работает. Я проверил.


 
Johnmen ©   (2008-02-21 10:11) [11]


> Sergey13 ©   (21.02.08 10:10) [10]

Спасибо.


 
Игорь Шевченко ©   (2008-02-21 10:14) [12]

Johnmen ©   (21.02.08 10:03) [9]


> Если не сложно, проверь, как будет с [7]. Мне просто стало
> интересно...:)


Также, как с моим вариантом. Работает.

Спасибо :)


 
sniknik ©   (2008-02-21 10:45) [13]

> Что ж ты не написал решения? В [2] это скрипт, фактичекски несохраненная ХП или неименованный PL/SQL блок в терминологии оракла.
читай там же
> (ввиду того что в 2000-ном MSSQL отсутствует ROW_NUMBER, да и по скорости должно быть быстрее хотя и букв в пакете больше...)

если бы был, а в оракле точно знаю, что есть, и если плюнуть на то что в общем идейно решение уже предложено в [1]...
то вариант (с + идея из [2])
(нет 2005-го, не знаю будет ли рабочим)

SELECT ROW_NUMBER() OVER (ORDER BY Name) * 2 - 1 AS ID, Name, Gender FROM People WHERE Gender = "F"
UNION
SELECT ROW_NUMBER() OVER (ORDER BY Name) * 2, Name, Gender FROM People WHERE Gender = "M"


 
Evgeny V ©   (2008-02-21 10:57) [14]


> sniknik ©   (21.02.08 10:45) [13]

Да на 2005 работает,
SELECT ROW_NUMBER() OVER (ORDER BY Name) * 2 - 1 AS ID, Name, Gender FROM People WHERE Gender = "F"
UNION
SELECT ROW_NUMBER() OVER (ORDER BY Name) * 2, Name, Gender FROM People WHERE Gender = "M"
ORDER BY ID

Кортоко:-))



Страницы: 1 вся ветка

Форум: "Базы";
Текущий архив: 2008.08.03;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.48 MB
Время: 0.011 c
3-1203489861
Kolan
2008-02-20 09:44
2008.08.03
Как добавить в DataSet колонку.


15-1213723148
@!!ex_
2008-06-17 21:19
2008.08.03
Проблемы с начальством


2-1214936641
Boston
2008-07-01 22:24
2008.08.03
Окно настроек


15-1213368104
Виталий_2
2008-06-13 18:41
2008.08.03
MAC-адрес


2-1215350613
Сашик
2008-07-06 17:23
2008.08.03
Удаление множества записей (SQL, Access)





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский