Гость
Форумы / Oracle APEX [игнор отключен] [закрыт для гостей] / как правильно составить запрос? / 7 сообщений из 7, страница 1 из 1
09.06.2010, 12:14
    #36677688
terra_nova2
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
как правильно составить запрос?
Есть 4 таблички:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
+-----------------------+   +-----------------------+   +-----------------------+   +-----------------------+
|       table # 1         |   |       table # 2         |   |       table # 3         |   |       table # 4         |
+-----+-----+------+----+   +-----+-----+------+----+   +-----+-----+------+----+   +-----+-----+------+----+
|t1ID |P_ID | I_ID | Q1 |   |t2ID |P_ID | I_ID | Q2 |   |t3ID |P_ID | I_ID | Q3 |   |t4ID |P_ID | I_ID | Q4 |
+-----+-----+------+----+   +-----+-----+------+----+   +-----+-----+------+----+   +-----+-----+------+----+
|     |   1   |   1    |  10  |   |     |   1   |    2   |  30  |   |     |   1   |    3   |   5  |   |     |   1   |    1   |   7  |            
+-----+-----+------+----+   +-----+-----+------+----+   +-----+-----+------+----+   +-----+-----+------+----+
|     |   1   |   2    |  20  |   |     |   2   |    1   |   7  |   |     |   1   |    2   |   5  |   |     |   1   |    5   |  12  |         
+-----+-----+------+----+   +-----+-----+------+----+   +-----+-----+------+----+   +-----+-----+------+----+

Значения P_ID и I_ID берутся из одной и той же таблицы

Как должен выглядеть запрос чтобы получить такую таблицу:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
+-----+------+------+----+----+----+
|P_ID | I_ID |  Q1  | Q2 | Q3 | Q4 |
+-----+------+------+----+----+----+
|   1   |    2   |    20  |  30  |   5  |  - |
+-----+------+------+----+----+----+
|   1   |    1   |    10  |  - |  - |   7  |
+-----+------+------+----+----+----+
|   1   |    3   |    - |  - |   5  |  - |
+-----+------+------+----+----+----+
|   1   |    5   |    - |  - |  - |  12  |
+-----+------+------+----+----+----+
|   2   |    1   |    - |   7  |  - |   7  |  а вместо "-" чтобы были "0"
+-----+------+------+----+----+----+
Я понимаю что нужно использовать JOIN, но как?

ВАРИАНТ
через DBVizualizer имеем
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
SELECT                                                
    TABLE1.I_ID,
    TABLE1.P_ID,
    TABLE1.Q1,
    TABLE2.Q2,
    TABLE3.Q3,
    TABLE4.Q4                                       +------+-----+------+----+----+----+
FROM                                                | P_ID |I_ID |  Q1  | Q2 | Q3 | Q4 |
    TABLE1                                          +------+-----+------+----+----+----+
                                                    |   1    |   2   |  20    |  30  |   5  | (N)|
    FULL OUTER JOIN TABLE2     ON                   +------+-----+------+----+----+----+
    ( TABLE1.P_ID = TABLE2.P_ID )                   |   1    |   1   |   10   | (N)| (N)| (N)|
    AND (TABLE1.I_ID = TABLE2.I_ID)                 +------+-----+------+----+----+----+
                                                    |  (N) | (N) |  (N) |   7  | (N)| (N)|
    FULL OUTER JOIN TABLE3 ON                       +------+-----+------+----+----+----+
    (TABLE2.P_ID = TABLE3.P_ID)                     | (N)  |(N)  | (N)  | (N)|  5   | (N)|
    AND (TABLE2.I_ID = TABLE3.I_ID)                 +------+-----+------+----+----+----+
                                                    | (N)  |(N)  | (N)  | (N)| (N)|   12 |
    FULL OUTER JOIN TABLE4 ON                       +------+-----+------+----+----+----+
    (TABLE3.P_ID = TABLE4.P_ID)                     | (N)  |(N)  | (N)  | (N)| (N)|    7 |   где (N) - null
    AND (TABLE3.I_ID = TABLE4.I_ID)                 +------+-----+------+----+----+----+                 


Подскажите как это сделать?
...
Рейтинг: 0 / 0
09.06.2010, 14:30
    #36678221
suPPLer
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
как правильно составить запрос?
terra_nova2Подскажите как это сделать?

Такие вопросы лучше задавать в общий форум Oracle . Тем не менее, вот пример:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
with t1 as 
  (select  1  id,  1  val from dual
    union all
   select  2 ,  3  from dual)
   , t2 as
  (select  2  id,  1  val from dual
    union all
   select  3 ,  3  from dual)
select id, min(val1), min(val2)
  from (select id, val val1, to_number(null) val2
          from t1
         union all
        select id, to_number(null) val1, val val2
          from t2)
 group by id;
...
Рейтинг: 0 / 0
09.06.2010, 14:42
    #36678271
guest20100609
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
как правильно составить запрос?
Мой вариант:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
WITH t1 AS (
  SELECT  1  p_id,  1  i_id,  10  q1 FROM dual UNION ALL
  SELECT  1  p_id,  2  i_id,  20  q1 FROM dual
),
t2 AS (
  SELECT  1  p_id,  2  i_id,  30  q2 FROM dual UNION ALL
  SELECT  2  p_id,  1  i_id,  7  q1 FROM dual
),
t3 AS (
  SELECT  1  p_id,  3  i_id,  5  q3 FROM dual UNION ALL
  SELECT  1  p_id,  2  i_id,  5  q3 FROM dual
),
t4 AS (
  SELECT  1  p_id,  1  i_id,  7  q4 FROM dual UNION ALL
  SELECT  1  p_id,  5  i_id,  12  q4 FROM dual
)
SELECT 
       tt.p_id, tt.i_id, SUM(tt.q1) q1, SUM(tt.q2) q2, SUM(tt.q3) q3, SUM(tt.q4) q4
  FROM (SELECT t1.p_id, t1.i_id, t1.q1,  0  q2,  0  q3,  0  q4 FROM t1 UNION ALL
        SELECT t2.p_id, t2.i_id,  0  q1, t2.q2,  0  q3,  0  q4 FROM t2 UNION ALL
        SELECT t3.p_id, t3.i_id,  0  q1,  0  q2, t3.q3 q3,  0  q4 FROM t3 UNION ALL
        SELECT t4.p_id, t4.i_id,  0  q1,  0  q2,  0  q3, t4.q4 q4 FROM t4) tt
  GROUP BY
        tt.p_id, tt.i_id
...
Рейтинг: 0 / 0
09.06.2010, 14:59
    #36678321
terra_nova2
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
как правильно составить запрос?
suPPLer и guest20100609
спасибо что ответили!
Простите что ввел в заблуждение.
Исходные таблицы не ограничиваются двумя записями их будет примерно 150*12.
Как быть в таком случае?
За подход к реализации спасибо.
...
Рейтинг: 0 / 0
09.06.2010, 15:05
    #36678346
suPPLer
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
как правильно составить запрос?
terra_nova2Исходные таблицы не ограничиваются двумя записями их будет примерно 150*12.
0. 150*12 = 1800. Это обычно совсем не большой объём данных.
1. Две строки указаны как пример Ваших реальных данных. Сам запрос от этого не меняется.
...
Рейтинг: 0 / 0
14.06.2010, 17:45
    #36686158
terra_nova2
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
как правильно составить запрос?
suPPLer,
дякую.
Разобрался.
...
Рейтинг: 0 / 0
15.06.2010, 09:39
    #36686948
terra_nova2
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
как правильно составить запрос?
Вот окончательный вариант применительно к исходным данным:
Код: plaintext
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.
+-----------------------+   +-----------------------+   +-----------------------+   +-----------------------+
|       table # 1         |   |       table # 2         |   |       table # 3         |   |       table # 4         |
+-----+-----+------+----+   +-----+-----+------+----+   +-----+-----+------+----+   +-----+-----+------+----+
|t1ID |P_ID | I_ID | Q1 |   |t2ID |P_ID | I_ID | Q2 |   |t3ID |P_ID | I_ID | Q3 |   |t4ID |P_ID | I_ID | Q4 |
+-----+-----+------+----+   +-----+-----+------+----+   +-----+-----+------+----+   +-----+-----+------+----+
|     |   1   |   1    |  10  |   |     |   1   |    2   |  30  |   |     |   1   |    3   |   5  |   |     |   1   |    1   |   7  |            
+-----+-----+------+----+   +-----+-----+------+----+   +-----+-----+------+----+   +-----+-----+------+----+
|     |   1   |   2    |  20  |   |     |   2   |    1   |   7  |   |     |   1   |    2   |   5  |   |     |   1   |    5   |  12  |         
+-----+-----+------+----+   +-----+-----+------+----+   +-----+-----+------+----+   +-----+-----+------+----+


with table_all as
(
  SELECT
    tt.p_id,
    tt.i_id,
    SUM(tt.q1) q1,
    SUM(tt.q2) q2,
    SUM(tt.q3) q3,
    SUM(tt.q4) q4
  FROM
  (
    SELECT p_id, i_id,    q1,   0  q2,   0  q3,   0  q4 FROM table1 
    UNION ALL
    SELECT p_id, i_id,   0  q1,    q2,   0  q3,   0  q4 FROM table2
    UNION ALL
    SELECT p_id, i_id,   0  q1,   0  q2,    q3,   0  q4 FROM table3
    UNION ALL
    SELECT p_id, i_id,   0  q1,   0  q2,   0  q3,    q4 FROM table4
  ) tt
  GROUP BY tt.p_id, tt.i_id
)

select  p_id, i_id, q1, q2, q3, q4
from table_all
order by
p_id asc, i_id asc

результат:
 1 	 1 	 10 	 0 	 0 	 7 
 1 	 2 	 20 	 30 	 5 	 0 
 1 	 3 	 0 	 0 	 5 	 0 
 1 	 5 	 0 	 0 	 0 	 12 
 2 	 1 	 0 	 7 	 0 	 0 


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


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