Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Помощь с построением запроса / 6 сообщений из 6, страница 1 из 1
02.05.2018, 23:16
    #39639108
Arrsenal
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помощь с построением запроса
Доброго времени суток!

Есть такие три таблицы:


Нужен запрос, выводящий подобное:

Запрос выводит название досуга (dosug.name) и считает сколько в нем обучающихся разных возрастов(меньше 7, от 7 до 11, от 12 до 17, от 18 до 30, и больше 30) (информация о дате рождения в таблице student) и сколько всего.

Возраст студентов вычисляется, например, подобным образом:
SELECT
TRUNC(months_between(sysdate, student.birthdate) / 12)
FROM student
...
Рейтинг: 0 / 0
02.05.2018, 23:45
    #39639112
mefman
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помощь с построением запроса
LOL What?
12561782
...
Рейтинг: 0 / 0
03.05.2018, 01:43
    #39639128
Arrsenal
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помощь с построением запроса
У меня получился нужный результат, но текст запроса длинный получился

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
select name, col, col1, col2, col3, col4, col5
from 
(
select  dosug.name as name, (select count(cd_group.group_member_id) from cd_group where cd_group.dosug_id = dosug.dosug_id) as col,

(select count(cd_group.group_member_id) from cd_group where cd_group.dosug_id = dosug.dosug_id  and
(SELECT TRUNC(months_between(sysdate, student.birthdate) / 12) FROM student WHERE student.student_id = cd_group.student_id) < 7) as col1,

(select count(cd_group.group_member_id) from cd_group where cd_group.dosug_id = dosug.dosug_id  and
(SELECT TRUNC(months_between(sysdate, student.birthdate) / 12) FROM student WHERE student.student_id = cd_group.student_id) between 8 and 11) as col2,

(select count(cd_group.group_member_id) from cd_group where cd_group.dosug_id = dosug.dosug_id  and
(SELECT TRUNC(months_between(sysdate, student.birthdate) / 12) FROM student WHERE student.student_id = cd_group.student_id) between 12 and 17) as col3,

(select count(cd_group.group_member_id) from cd_group where cd_group.dosug_id = dosug.dosug_id  and
(SELECT TRUNC(months_between(sysdate, student.birthdate) / 12) FROM student WHERE student.student_id = cd_group.student_id) between 18 and 30) as col4,

(select count(cd_group.group_member_id) from cd_group where cd_group.dosug_id = dosug.dosug_id  and
(SELECT TRUNC(months_between(sysdate, student.birthdate) / 12) FROM student WHERE student.student_id = cd_group.student_id) > 30) as col5

from student 
inner join cd_group on student.student_id = cd_group.student_id
inner join dosug on cd_group.dosug_id = dosug.dosug_id
)
group by name, col, col1, col2, col3, col4, col5
...
Рейтинг: 0 / 0
03.05.2018, 11:25
    #39639252
tip78
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помощь с построением запроса
а почему age то в досуге
это же не ограничитель, а атрибут студента
...
Рейтинг: 0 / 0
03.05.2018, 12:34
    #39639318
Stax
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помощь с построением запроса
Arrsenal,

набейте тестовые данные (with ...)

ps
решение аля pivot

.....
stax
...
Рейтинг: 0 / 0
03.05.2018, 12:45
    #39639335
tip78
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помощь с построением запроса
что за category в досуге - хз, если это по возрасту, то я брал возраст напрямую у студента
создание таблиц можете пропустить, они ведь у вас есть, просто переделайте их правильно
(у меня под postgres)
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
drop table if exists stu;
create table stu(
id serial,
name1 text,
name2 text,
birth timestamptz(0) default now(),
age int,
phone text
);

drop table if exists dosug;
create table dosug(
id serial,
name text,
cat smallint
);

drop table if exists stu_dos;
create table stu_dos(
stu_id int,
dos_id int
);


insert into stu (id,name1,name2,age) values (generate_series(1,1000), gen_str(20), gen_str(20), my_rand(5,50));
insert into dosug (id,name,cat) values (generate_series(1,50), gen_str(20), my_rand(1,5));
insert into stu_dos (stu_id,dos_id) select my_rand(1,50), my_rand(1,50) from generate_series(1,1000);


SELECT
t3.name,count(stu_id),
SUM(CASE WHEN t2.age <7 THEN 1 END) AS cat1,
SUM(CASE WHEN t2.age BETWEEN 7 AND 11 THEN 1 END) AS cat2,
SUM(CASE WHEN t2.age BETWEEN 12 AND 17 THEN 1 END) AS cat3,
SUM(CASE WHEN t2.age BETWEEN 18 AND 30 THEN 1 END) AS cat4,
SUM(CASE WHEN t2.age >30 THEN 1 END) AS cat5

FROM stu_dos t1
JOIN stu t2 ON t1.stu_id = t2.id
JOIN dosug t3 ON t1.dos_id = t3.id
GROUP BY dos_id,t3.name

         name         | count | cat1 | cat2 | cat3 | cat4 | cat5 
----------------------+-------+------+------+------+------+------
 OoV5GOH5Dxmls1YLfoCW |    17 |      |    1 |      |    4 |   12
 srNkVsr0KVxf6v6Gcr6L |    20 |      |    1 |    3 |    5 |   11
 Ikio3JKSOA1Ge1W8XTud |    18 |      |    3 |    2 |    4 |    9
 NY4pRL45pM5LF45dJYmy |    19 |    1 |    1 |    1 |    6 |   10
 hXuFmSeHqqpcukF5VUvG |    29 |      |    1 |    3 |    8 |   17
 fvozVqlG9O3Du7TeW8Y5 |    22 |      |    3 |    1 |    6 |   12
 Zl3tbAlFqkESYmgRsDno |    16 |      |    4 |    3 |    4 |    5
 oRQ4WvXSCHp1muHBCMOA |    13 |      |    1 |    2 |    4 |    6
 6MLxr8qgPgCnTnTsGEdU |    18 |    2 |    4 |    1 |    5 |    6
 MPQtYq2nnA3aEN5cklob |    18 |      |    2 |    1 |    3 |   12
 Fm4KUONgCq5mamfnStF5 |    22 |      |    4 |    2 |    4 |   12
 6fiuRoDa5Vz1pv4hK3Cn |    16 |    2 |    2 |    1 |    2 |    9
 I0ff93kh814g6u8QxDGK |    24 |      |    4 |    3 |    5 |   12
 m5X4GjQetYoxhXMW5vsI |    17 |    1 |    2 |      |    5 |    9
 wWnldVHrFrn5NqLp7qdf |    27 |      |    4 |    2 |    5 |   16
 mHQoDJFuwdawJDQP4YKh |    20 |      |    3 |    3 |    7 |    7
 PuKv4rPyVTQClFJJUyKD |    28 |      |    3 |    7 |    5 |   13
 CwjfcGmBLjh9EaSmPfea |    19 |    1 |    1 |    1 |    6 |   10
 fbhCd5QFpvVTuyy4YiKf |    16 |      |    3 |    4 |    3 |    6
 4vO9YAtNlkyxNGxTRDeo |    29 |    2 |    4 |    6 |    4 |   13
 ybnYEs6WMvTtiFXFWPUP |    17 |    1 |    1 |    2 |    8 |    5
 aYb9BpmGgZEPlDW2NEbl |    20 |    1 |    3 |    2 |    5 |    9
 tkUDfkGspnhBhJ6BdXrH |    22 |    3 |    3 |    1 |    4 |   11
 bYMgCgGyfOHf4xo7iVEj |    23 |      |    2 |    4 |    3 |   14
 GdySVAZjG7KniTyZGGGp |    10 |      |    1 |      |    4 |    5
 VOmbePSkkE5M1ayEVGjk |    23 |      |    2 |    1 |    9 |   11
 KbmVcDvHVEAMcurVmsoI |    34 |    1 |    2 |    5 |    9 |   17
 R3BtpaZUA8vkYgCd1blx |    15 |    1 |      |    4 |    6 |    4
 W2WdCBA4SbAsrO2O4BbK |    20 |      |    6 |    3 |    2 |    9
 SaQkQ5KP7wc5gHgw5rIo |    16 |      |      |    2 |    2 |   12
 WmTsKZoDrBsnzsIqeZy2 |    12 |      |    2 |    1 |    6 |    3
 f0edT6p8vdMYvlql7cJV |    19 |      |    1 |    1 |    6 |   11
 YrUzGTWwm6aW3FNREQXT |    20 |      |    2 |    2 |    7 |    9
 TWWtvZSGHOAt5tJtG2D5 |    23 |      |    5 |    2 |    4 |   12
 upU3GTGWmZ8MvoYc5XHT |    19 |    1 |    1 |    3 |    4 |   10
 xMbxQAgkpjtEF2C2QPeI |    14 |      |    2 |    1 |    6 |    5
 Y4UCY1htLuQMS4ZcEd5q |    21 |    2 |    2 |    3 |    6 |    8
 5QFF9Wf9CF3xjGcUWVLK |    17 |    1 |      |    4 |    6 |    6
 zVsyjOFT9fZV1XN9N5Y5 |    22 |    1 |    2 |      |    4 |   15
 FcIOIpMlXNpTly2vsPhc |    20 |      |    1 |    2 |    9 |    8
 2e2Al1Lx7VL9mdROzWgJ |    15 |    1 |    2 |    1 |    4 |    7
 RgJo8XFe1ixlSmok6I9H |    17 |    1 |    1 |    2 |    2 |   11
 oLscuTKQgctD9n9iHQzf |    19 |    1 |    3 |    1 |    8 |    6
 djveqOy36F4kHFWIZVP5 |    22 |    1 |    4 |    3 |    6 |    8
 sdgjPoMiJoVaGLnZaiWE |    28 |      |    2 |    4 |    8 |   14
 9OW8xmOEcrsEZ5reV7UR |    16 |      |    3 |      |      |   13
 xiCy7GAhaNHdrTDsB7D6 |    24 |      |      |    4 |    7 |   13
 A39iOoXaLDPmdTKZ1llI |    28 |    2 |    2 |      |   10 |   14
 bCcHz6BFBNaanUAfXxTh |    16 |      |    1 |    2 |    5 |    8
 OaihtDgDRcJ7KEY9Q8Fw |    20 |      |    2 |    1 |    4 |   13
(50 строк)
...
Рейтинг: 0 / 0
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Помощь с построением запроса / 6 сообщений из 6, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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