powered by simpleCommunicator - 2.0.49     © 2025 Programmizd 02
Форумы / Oracle [игнор отключен] [закрыт для гостей] / соединение таблиц
8 сообщений из 8, страница 1 из 1
соединение таблиц
    #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
соединение таблиц
    #40085629
PuM256
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
reaque,

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

Т.е. в результате должны быть колонки vote_id, ans_id, count или vote_id, count_a1, count_a2?
...
Рейтинг: 0 / 0
соединение таблиц
    #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
соединение таблиц
    #40085632
reaque
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
PuM256,

Код: plsql
1.
2.
3.
4.
5.
Должно быть примерно так:
1	Какой ваш возраст	до 30 лет:	                1
1	Какой ваш возраст	более 30 лет:	        1
2	Какой ваш стаж	до 10 лет: 	        1
2	Какой ваш стаж	более 10 лет:    	0
...
Рейтинг: 0 / 0
соединение таблиц
    #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
соединение таблиц
    #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
соединение таблиц
    #40085656
reaque
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Stax, спасибо за unpivot
...
Рейтинг: 0 / 0
соединение таблиц
    #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
8 сообщений из 8, страница 1 из 1
Форумы / Oracle [игнор отключен] [закрыт для гостей] / соединение таблиц
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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