Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

SQL-запрос для выборки данных [D7, FIREBIRD]


Страницы:   1 2

serguncho ©   (2005-07-22 22:47:00) 

Добрый вечер!

Помогит разрешите проблему с запросом, пожалуйста.

Имею таблицу (tablica) c полями
NOMER_CLENA INTEGER,  
POL_CLENA   VARCHAR(1), /может быть М (мальчОнка) или F (девчОнка)/
CARD_CLENA VARCHAR(5), /пол+номер, например, F4/
RAITING FLOAT,
...

Мне нужно выбрать две самых рейтинговых дивчины и два самых-самых парня.

Думал сначала отсортировать по рейтингу и выбрать 4 души:
select first 4(*) from tablica order by RAITING

но понял ошибку, т.к. могут получиться 4 парня или 3 девушки и один парень, а никак не 50/50.

Подскажите, как организовать грамотный запрос по выборке людей (причем кол-во может быть и не пропорционально 1\1, а, например, 3 девушки- и 2 парня-лидера).


Anatoly Podgoretsky   (2005-07-23 12:58:00) [21]

sniknik ©   (23.07.05 11:42) [6]
ORDER BY в ANSI SQL может применяться только для результата


Anatoly Podgoretsky   (2005-07-23 12:57:00) [22]

select first 2 * from TABLICA where POL_CLENA='m'
union
select first 2 * from TABLICA where POL_CLENA='f'
ORDER BY поле поле, поле рейтинг


serguncho   (2005-07-23 11:52:00) [23]

sniknik © [6]
почему тогда не так?
select first 2 * from TABLICA where POL_CLENA='m' ORDER BY 7
union
select first 2 * from TABLICA where POL_CLENA='f' ORDER BY 7
---------
Ругается на такую команду.

P.N.P. ©  [5]
Спасибо. Протестирую и проинформирую о результатах. Хотя все это громоздко. Хотелось чего-то простого, как г-н sniknik написал. Не работает, увы!


sniknik   (2005-07-23 11:42:00) [24]

почему тогда не так?
select first 2 * from TABLICA where POL_CLENA='m' ORDER BY 7
union
select first 2 * from TABLICA where POL_CLENA='f' ORDER BY 7


P.N.P.   (2005-07-23 10:43:00) [25]

А если процедуру сделать?

SET TERM ^ ;

CREATE PROCEDURE GET_RAITING (
   COUNT_M INTEGER,
   COUNT_F INTEGER,
   INACCURACY FLOAT)
RETURNS (
   NC INTEGER,
   POL VARCHAR(1),
   CARD VARCHAR(5),
   RAIT FLOAT)
AS
DECLARE VARIABLE MAX_RAITING FLOAT; /* Максимальный рейтинг */
DECLARE VARIABLE M_CNT INTEGER; /* Счетчик М */
DECLARE VARIABLE F_CNT INTEGER; /* Счетчик Ж */
begin
if (count_m<1 or count_f<1) then
   exit;
select max(raiting)-:inaccuracy from table1 into :max_raiting;
m_cnt=0;
f_cnt=0;
for select t.nomer_clena,t.pol_clena,t.card_clena,t.raiting from table1 t
  where t.raiting>=:max_raiting into :nc, :pol, :card, :rait
    do
      begin
         if (pol='M' and m_cnt<count_m) then
         begin
          m_cnt=m_cnt+1;
          suspend;
            end
         if (pol='F' and f_cnt<count_f) then
         begin
          f_cnt=f_cnt+1;
          suspend;
            end
        if (m_cnt=count_m and f_cnt=count_f) then
         exit;
      end
end
^

SET TERM ; ^

DESCRIBE PARAMETER NC PROCEDURE GET_RAITING
'Номер';
DESCRIBE PARAMETER POL PROCEDURE GET_RAITING
'Пол';
DESCRIBE PARAMETER CARD PROCEDURE GET_RAITING
'Пол+номер';
DESCRIBE PARAMETER RAIT PROCEDURE GET_RAITING
'Рейтинг';
DESCRIBE PARAMETER COUNT_M PROCEDURE GET_RAITING
'Кол-во мужчин';
DESCRIBE PARAMETER COUNT_F PROCEDURE GET_RAITING
'Кол-во женщин';
DESCRIBE PARAMETER INACCURACY PROCEDURE GET_RAITING
'Погрешность';


serguncho   (2005-07-23 09:52:00) [26]

Как у тебя рейтинг начисляется?
-------------------------------
6 вариантов - посетил:
1)5 занятий (каждый день): 100
2)4 занятия              :  80
3)3 заняти               :  60
4)2 занятия              :  40
5)1 занятие              :  20  
6)0 занятий              :   0
-------------------------------
Так что сравнивать с каким-то значением, наверное, просто так будет сложно. Особенно, если пионеры - заядлые прогульщики.
Можно, конечно, предварительно отсортировать их и в качестве параметров (для дальнейшего сравнения по Вашему коду) загнать значение 3-х парней и дам, но и тут можно получить косяк, т.к. у у 3 и 2 могут быть одинаковые значения рейтинга.


P.N.P.   (2005-07-23 09:28:00) [27]

>serguncho ©   (23.07.05 09:06) [2]
Как у тебя рейтинг начисляется?
Может можно сделать что-то вроде
select first 2 * from TABLICA where POL_CLENA='m'
and RAITING>
(select max(RAITING) from TABLICA where
POL_CLENA='m')-какое_то_число
union
select first 2 * from TABLICA where POL_CLENA='f'
and RAITING>
(select max(RAITING) from TABLICA where
POL_CLENA='f')-какое_то_число
ORDER BY 7


serguncho   (2005-07-23 09:06:00) [28]

Union работает. Спасибо за подсказку.
Но я чего не могу им правильно пользоваться.

select first 2 * from TABLICA where POL_CLENA='m'
union
select first 2 * from TABLICA where POL_CLENA='f'
ORDER BY 7

Он сортирует по нужном полю (рейтингу), но сортирует итоговую выборку. А мне нужно взять по два самых результативных каждого пола.


sniknik   (2005-07-22 23:45:00) [29]

union в файрбирде дозволяются? вот и выбирай в 2 запроса раздельно для M и Ж обьедененняя их union-ом. (чтобы не получилось в сумме 8 выбирай по 2 ;)


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо