Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Oracle > выборка из одной таблицы с разными параметрами


Автор: Swatch 5.2.2015, 05:58
Подскажите, пожалуйста, есть таблица, в которой хранятся работники, выполненные ими типы заданий (для одного может быть их много), и статус по заданиям. Мне нужно написать выборку, чтобы получился список работников в первом столбце, а в остальных количество заданий по статусам. Примерно в таком виде:
  
            тип    Тип                     Всего выполнено    Заданий взятых
            задания1      задания 2             заданий                 в работу
работник 1    5      1                               2                             6
работник 2    2       2                               2                           4

Я пишу примерно так
Код

select distinct rabotnic,
(select count(1) from rabot r where r.rabotnik_id=a.rabotnik_id/*условие 1*/)
,(select count(1) from rabot r  where r.rabotnik_id=a.rabotnik_id/*условие 2*/)
,(select count(1) from rabot r where r.rabotnik_id=a.rabotnik_id/*условие 3*/)
,(select count(1) from rabot r where r.rabotnik_id=a.rabotnik_id/*условие 4*/)
from rabot a
where 
/*условие 5*/
order by rabotnic


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

Есть идеи, как написать по-другому?

Автор: Akina 5.2.2015, 08:57
Почитайте про GROUP BY

Автор: Swatch 5.2.2015, 09:07
Попыталась сделать транспонирование. получилось красиво, но почему-то теперь по работникам не объединяется. Код такой 
Код

select rabotnic,
decode(type,'type1',ct,null)
,decode(type,'type2',ct,null)
from 
(select rabotnic, count(1) ct, type from rabot r 
where 
/*условие 1*/
group by rabotnic,type
)
group by rabotnic
order by rabotnic


Вот последний group by rabotnic почему-то не хочет работать. 

Автор: Akina 5.2.2015, 12:34
Наверное, потому, что не понимает, чего ты хочешь.
Почитай ещё и про алиасы.

Автор: Swatch 5.2.2015, 12:49
алиасы тут не при чем. и они, кстати, не помогли. Помог вызов max перед декодами. smile

Автор: Akina 5.2.2015, 13:12
Цитата(Swatch @  5.2.2015,  13:49 Найти цитируемый пост)
алиасы тут не при чем

Вообще-то при чём. Поле rabotnic есть как в наборе записей подзапроса, так и в таблице, являющейся его источником.

Цитата(Swatch @  5.2.2015,  13:49 Найти цитируемый пост)
Помог вызов max перед декодами.

Да вообще непонятно, как Oracle не послал тебя в syntax error с частичной группировкой. Это не MySQL, а Decode ни разу не групповая операция.

Автор: Zloxa 5.2.2015, 22:16
Цитата(Akina @  5.2.2015,  14:12 Найти цитируемый пост)
непонятно, как Oracle не послал тебя в syntax error

От чего-ж не послал, судя по всему - послал 

Цитата(Swatch @  5.2.2015,  10:07 Найти цитируемый пост)
почему-то не хочет работать.


Цитата(Akina @  5.2.2015,  14:12 Найти цитируемый пост)
Поле rabotnic есть как в наборе записей подзапроса, так и в таблице, являющейся его источником.

У них разные зоны видимости. Извне подзапроса видно только то из него, что перечислено в его select-list. Конфликта имен тут не должно быть. Разве что внутри подзапроса, где джойн.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)