Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / IBM DB2, WebSphere, IMS, U2 [игнор отключен] [закрыт для гостей] / Можно ли сделать одним запросом / 6 сообщений из 6, страница 1 из 1
20.04.2016, 00:10
    #39219678
cold09
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Можно ли сделать одним запросом
Есть две таблицы:
сотрудники и отделы: emp, otdel
сотрудники: emp
id, name, birth, sex, id_otd

id номер по порядку
name имя
birth Дата рождения
sex Пол - 1-м, 0-ж
id_otd номер отдела

отделы: otdel
id_otd, name_otd

id_otd номер отдела
name_otd название отдела

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

отдел кадров
----------------------------
возраст М Ж
----------------------------
20 4 0
21 3 2
22 10 7
23 21 8
.....
69 2 1
70 1 0

К сожалению, меня хватило только на такое..

select year(CURRENT DATE-birth) vozr from emp e
join otdel ot on e.id_otd=ot.id_otd
where ot.id_otd in ( 1 )
and e.sex=1
order by vozr

получаю список с одинаковыми возрастами и по одному полу, например М (1) одного отдела,
потом запускаю запрос с полом Ж (0) и так для каждого отдела потом уже макросиком делаю нужную мне таблицу..
...
Рейтинг: 0 / 0
20.04.2016, 09:25
    #39219816
Mark Barinstein
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Можно ли сделать одним запросом
cold09,

Как-то так
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
with emp (id, name, birth, sex, id_otd) as (values
  (1, '1', date('1970-01-01'), 'М', 1)
, (2, '2', date('1980-01-02'), 'Ж', 1)
, (3, '3', date('1980-01-03'), 'Ж', 2)
)
, otdel (id_otd, name_otd) as (values
  (1, 'Кадры')
, (2, 'Не кадры')
)
select ot.name_otd, a.vozr
, count(case e.sex when 'М' then 1 end) "М"
, count(case e.sex when 'Ж' then 1 end) "Ж"
from (
select distinct year(CURRENT DATE-birth) vozr
from emp
) a
left join emp e on a.vozr=year(current date-e.birth)
left join otdel ot on e.id_otd=ot.id_otd
group by ot.name_otd, a.vozr
order by ot.name_otd, a.vozr;

...
Рейтинг: 0 / 0
21.04.2016, 06:59
    #39220758
cold09
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Можно ли сделать одним запросом
Mark Barinstein,

ага... Огромное спасибо за пинок!
А то как обычно самому не соображается..

Я так понял первым ключевым моментом было создание подзапроса vozr - честно сказать не додумался бы для этого использовать фразу distinct

А вторым - left join emp e on a.vozr=year(current date-e.birth)

А я всё никак не понимал как же сделать группировку по полю возраста?
Никак не получалось..

Спасибо за науку!
...
Рейтинг: 0 / 0
22.04.2016, 01:57
    #39221969
cold09
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Можно ли сделать одним запросом
Mark Barinstein,

а вот в подзапросе НЕЛЬЗЯ использовать WHERE ?

вот тут:

select distinct year(CURRENT DATE-birth) vozr
from emp
where tmp.birth is not null
...
Рейтинг: 0 / 0
22.04.2016, 05:34
    #39221991
cold09
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Можно ли сделать одним запросом
Mark Barinstein,

просто не могу понять.. пробую запустить запрос на реальных данных
ошибка
[Error Code: -420, SQL State: 22018] DB2 SQL Error: SQLCODE=-420, SQLSTATE=22018, SQLERRMC=DECFLOAT, DRIVER=4.18.60

база старая и поля дат рождения есть пустые, пол тоже пустой..

имитирую пропуски значений в данных не в базе а в

with emp (id, name, birth, sex, id_otd, status_id) as (values
(1, '1', date('1970-01-01'), 'М', 1,1)
, (2, '2', date('1980-01-02'),null, 1,2)

....

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

как только кручу на базе - ошибка..

Для определённости могу сказать, что добавил вот такой фильтр в основной запрос
....
where ot.name_otd=001

тогда ошибка, если убираю фильтр - крутится бесконечно...

записей в таблице emp - 80 тысяч.. в справочниках - не больше 20
...
Рейтинг: 0 / 0
22.04.2016, 05:45
    #39221993
cold09
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Можно ли сделать одним запросом
Mark Barinstein,

может быть я просто не дожидаюсь...
может можно как-то вывести первые хоть сколько то получившихся записей ?
...
Рейтинг: 0 / 0
Форумы / IBM DB2, WebSphere, IMS, U2 [игнор отключен] [закрыт для гостей] / Можно ли сделать одним запросом / 6 сообщений из 6, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]