Гость
Форумы / Oracle [игнор отключен] [закрыт для гостей] / соединение таблиц / 8 сообщений из 8, страница 1 из 1
23.07.2021, 09:02
    #40085626
reaque
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
соединение таблиц
Есть таблица опросов
id, -- порядковый номер вопроса
q, -- текст вопроса
a1, -- вариант ответа 1
a2 -- вариант ответа 2

Есть таблица ответов
vote_id, -- порядковый номер вопроса из верхней таблицы (опросов)
emp_id, -- работник
ans_id -- порядковый номер ответа из верхней таблицы (если выбран ответ a1, то запишется 1; если a2 - запишется 2).

Как получить отчет за какой ответ сколько голосов отдали?
учитывая, если в таблице ответов по одному и тому же вопросу все ответы одинаковые (например со значением 1, то напротив значения 2 вывести 0).

p.s. вариантов ответов на самом деле больше, для простоты указал только два.

исходные таблицы

WITH vote AS
(
select '1' id, 'Какой ваш возраст' q,'до 30 лет' a1,'более 30 лет' a2 from dual
union all
select '2', 'Какой ваш стаж','до 10 лет','более 10 лет' from dual
)
select * from vote;


WITH voting AS
(
select '1' vote_id, '1000' emp_id, '1' ans_id from dual
union all
select '1' vote_id, '1001' emp_id, '2' ans_id from dual
union all
select '2' vote_id, '1000' emp_id, '1' ans_id from dual
)
select * from voting;
...
Рейтинг: 0 / 0
23.07.2021, 09:18
    #40085629
PuM256
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
соединение таблиц
reaque,

Варианты ответов должны быть в столбцах или в строках?

Т.е. в результате должны быть колонки vote_id, ans_id, count или vote_id, count_a1, count_a2?
...
Рейтинг: 0 / 0
23.07.2021, 09:19
    #40085631
reaque
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
соединение таблиц
reaque,
Пока получилось нарисовать только такой ужас.
Полагаю, что можно написать что-то попроще. И к тому же в текущей версии не отображаются варианты ответов, за которые пока никто не голосовал.
Код: 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.
26.
27.
28.
29.
30.
31.
select vote_id, q, 
 case ans_id
        when '1' then (select a1 from vote where vote_id = id)
        when '2' then (select a2 from vote where vote_id = id)
    end ans_id, 
    k
from
(
    WITH voting AS 
    (
    select '1' vote_id, '1000' emp_id, '1' ans_id from dual
        union all
    select '1' vote_id, '1001' emp_id, '2' ans_id from dual
        union all
    select '2' vote_id, '1000' emp_id, '1' ans_id from dual
    )
    select vote_id, q, ans_id, count(1) k 
    from voting
    left join 
    (
        WITH vote AS 
        (
        select '1' id, 'Какой ваш возраст' q,'до 30 лет' a1,'более 30 лет' a2 from dual
            union all
        select '2', 'Какой ваш стаж','до 10 лет','более 10 лет' from dual
        )
        select * from vote
    ) v on vote_id = v.id
    group by vote_id, q, ans_id
)
;
...
Рейтинг: 0 / 0
23.07.2021, 09:22
    #40085632
reaque
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
соединение таблиц
PuM256,

Код: plsql
1.
2.
3.
4.
5.
Должно быть примерно так:
1	Какой ваш возраст	до 30 лет:	                1
1	Какой ваш возраст	более 30 лет:	        1
2	Какой ваш стаж	до 10 лет: 	        1
2	Какой ваш стаж	более 10 лет:    	0
...
Рейтинг: 0 / 0
23.07.2021, 09:32
    #40085635
reaque
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
соединение таблиц
reaque,
Ответ должен быть примерно такой, но хотелось бы попроще конструкцию.
При увеличении кол-ва ответов конструкция будет увеличиваться.
Код: 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.
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.
select vote.*, nvl(k,0) from
(
    WITH vote AS 
    (
    select '1' id, 'Какой ваш возраст' q,'до 30 лет' a1,'более 30 лет' a2 from dual
        union all
    select '2', 'Какой ваш стаж','до 10 лет','более 10 лет' from dual
    )
    select id, q, a1 from vote
        union
    select id, q, a2 from vote
)  vote
left join
(
    select vote_id,  
     case ans_id
            when '1' then (
                WITH vote AS 
                (
                    select '1' id, 'Какой ваш возраст' q,'до 30 лет' a1,'более 30 лет' a2 from dual
                        union all
                    select '2', 'Какой ваш стаж','до 10 лет','более 10 лет' from dual
                    )
                    select a1 from vote where vote_id = id
                )
            when '2' then (
                WITH vote AS 
                (
                    select '1' id, 'Какой ваш возраст' q,'до 30 лет' a1,'более 30 лет' a2 from dual
                        union all
                    select '2', 'Какой ваш стаж','до 10 лет','более 10 лет' from dual
                    )
                select a2 from vote where vote_id = id
                )
                
        end ans_id, 
        k
    from
    (
        WITH voting AS 
        (
        select '1' vote_id, '1000' emp_id, '1' ans_id from dual
            union all
        select '1' vote_id, '1001' emp_id, '2' ans_id from dual
            union all
        select '2' vote_id, '1000' emp_id, '1' ans_id from dual
        )
        select vote_id, ans_id, count(1) k 
        from voting
        group by vote_id, ans_id
    )
) v on vote.id = v.vote_id and vote.a1 = v.ans_id
order by id
...
Рейтинг: 0 / 0
23.07.2021, 10:29
    #40085651
Stax
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
соединение таблиц
reaque,
Код: 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.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
SQL> ed
Wrote file afiedt.buf

  1   WITH vote AS
  2      (
  3      select '1' id, 'Какой ваш возраст' q,'до 30 лет' a1,'более 30 лет' a2 from dual
  4          union all
  5      select '2', 'Какой ваш стаж','до 10 лет','более 10 лет' from dual
  6      )
  7   , voting AS
  8          (
  9          select '1' vote_id, '1000' emp_id, '1' ans_id from dual
 10              union all
 11          select '1' vote_id, '1001' emp_id, '2' ans_id from dual
 12              union all
 13          select '1' vote_id, '1002' emp_id, '2' ans_id from dual
 14              union all
 15          select '2' vote_id, '1000' emp_id, '1' ans_id from dual
 16          )
 17  , v as (
 18    select   * from vote v
 19    unpivot (a for ans in (a1 as '1',a2 as '2'))
 20  )
 21  select
 22    id
 23   ,max(q) q
 24   ,ans
 25   ,max(a)
 26   ,count(ans_id) cc
 27  from v,voting where v.id=vote_id(+) and v.ans=ans_id(+)
 28  group by id,ans
 29* order by 1,3
SQL> /

I Q                 A MAX(A)               CC
- ----------------- - ------------ ----------
1 Какой ваш возраст 1 до 30 лет             1
1 Какой ваш возраст 2 более 30 лет          2
2 Какой ваш стаж    1 до 10 лет             1
2 Какой ваш стаж    2 более 10 лет          0

SQL>



......
stax
...
Рейтинг: 0 / 0
23.07.2021, 10:48
    #40085656
reaque
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
соединение таблиц
Stax, спасибо за unpivot
...
Рейтинг: 0 / 0
23.07.2021, 17:33
    #40085761
SQL*Plus
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
соединение таблиц
reaque
PuM256,

Код: plsql
1.
2.
3.
4.
5.
Должно быть примерно так:
1	Какой ваш возраст	до 30 лет:	                1
1	Какой ваш возраст	более 30 лет:	        1
2	Какой ваш стаж	до 10 лет: 	        1
2	Какой ваш стаж	более 10 лет:    	0


[spoiler] "Какие ваши доказательства?"
YouTube Video
...
Рейтинг: 0 / 0
Форумы / Oracle [игнор отключен] [закрыт для гостей] / соединение таблиц / 8 сообщений из 8, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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