Группировка данных в Oracle - PullRequest
0 голосов
/ 02 октября 2018

Я новичок в SQL oracle, у меня есть это требование, чтобы я должен был сгруппировать зарегистрированные данные по поставщику и по его запросу.Либо я должен использовать поставщика в качестве своего утверждения WHERE, либо я не знаю.,,У меня проблемы с этим, в настоящее время у меня есть этот SQL-оператор:

SELECT
F1.order_no,
F1.code,
F1.disp_order,
F1.lvl,
F1.description,
F3.state,
F2.supplier_id
FROM tbl_main F1
LEFT JOIN tbl_pattern F2
ON F1.order_no = F2.order_no
AND F1.code = F2.code
LEFT JOIN tbl_child F3
ON F1.order_no = F3.order_no
AND F1.code = F3.code

Это данные, зарегистрированные в таблице:

tbl_main

+----------+------+------------+-----+-------------+
| order_no | code | disp_order | lvl | description |
+----------+------+------------+-----+-------------+
| RM001-01 | 1    | 0          |  1  | HK140904-1A |
| RM001-01 | 2    | 1          |  2  | HK140904-1B |
| RM001-01 | 3    | 2          |  3  | HK140904-1C |
| RM001-01 | 4    | 3          |  4  | HK140904-1D |
| RM001-01 | 5    | 4          |  5  | HK140904-1E |
| RM001-01 | 6    | 5          |  2  | HK140904-1F |
| RM001-01 | 7    | 6          |  3  | HK140904-1G |
| RM001-01 | 8    | 7          |  3  | HK140904-1H |
| RM001-01 | 9    | 8          |  4  | HK140904-1I |
+----------+------+------------+-----+-------------+

tbl_pattern

+----------+------+------------+-----+-------------+---------+-------------+------------+
| order_no | code | disp_order | lvl | description | pattern | supplier_id | request_no |
+----------+------+------------+-----+-------------+---------+-------------+------------+
| RM001-01 | 1    | 0          |  1  | HK140904-1A |    1    |    0002     |20181001-001|
| RM001-01 | 5    | 4          |  5  | HK140904-1E |    1    |    0009     |20181001-002|
| RM001-01 | 1    | 0          |  1  | HK140904-1A |    1    |    0009     |20181001-003|
+----------+------+------------+-----+-------------+---------+-------------+------------+

tbl_parent

+----------+------+------------+-----+-------------+------------+
| order_no | code | disp_order | lvl | description | request_no |
+----------+------+------------+-----+-------------+------------+
| RM001-01 | 1    | 0          |  1  | HK140904-1A |20181001-001|
| RM001-01 | 5    | 4          |  5  | HK140904-1E |20181001-002|
| RM001-01 | 1    | 0          |  1  | HK140904-1A |20181001-003|
+----------+------+------------+-----+-------------+------------+

tbl_child

+----------+------+------------+-----+-------------+--------+------------+
| order_no | code | disp_order | lvl | description | state  | request_no |
+----------+------+------------+-----+-------------+--------+------------+
| RM001-01 | 2    | 1          |  2  | HK140904-1B |    0   |20181001-001|
| RM001-01 | 6    | 5          |  2  | HK140904-1F |    3   |20181001-001|
| RM001-01 | 7    | 6          |  3  | HK140904-1G |    1   |20181001-002|
| RM001-01 | 8    | 7          |  3  | HK140904-1H |    3   |20181001-002|
| RM001-01 | 9    | 8          |  4  | HK140904-1I |    1   |20181001-002|
| RM001-01 | 3    | 2          |  3  | HK140904-1C |    0   |20181001-003|
+----------+------+------------+-----+-------------+--------+------------+

Ниже приведены некоторые примеры результатов запроса, я думаю, мне нужно сделать это по параметру supplier_id или /и request_no, при условии, что пользователь выбирает шаблон, но я не знаю, как:

Если пользователь выбирает 1-ю запись в tbl_pattern, результат будет:

+----------+------+------------+-----+-------------+--------+-------------+
| order_no | code | disp_order | lvl | description | state  | supplier_id |
+----------+------+------------+-----+-------------+--------+-------------+
| RM001-01 | 1    | 0          |  1  | HK140904-1A |    2   |    0002     |
| RM001-01 | 2    | 1          |  2  | HK140904-1B |    0   |    0002     |
| RM001-01 | 3    | 2          |  3  | HK140904-1C |        |    0002     |
| RM001-01 | 4    | 3          |  4  | HK140904-1D |        |    0002     |
| RM001-01 | 5    | 4          |  5  | HK140904-1E |        |    0002     |
| RM001-01 | 6    | 5          |  2  | HK140904-1F |    3   |    0002     |
| RM001-01 | 7    | 6          |  3  | HK140904-1G |        |    0002     |
| RM001-01 | 8    | 7          |  3  | HK140904-1H |        |    0002     |
| RM001-01 | 9    | 8          |  4  | HK140904-1I |        |    0002     |
+----------+------+------------+-----+-------------+--------+-------------+

Если пользователь выбирает 2-ю запись в tbl_patternрезультат:

+----------+------+------------+-----+-------------+--------+-------------+
| order_no | code | disp_order | lvl | description | state  | supplier_id |
+----------+------+------------+-----+-------------+--------+-------------+
| RM001-01 | 1    | 0          |  1  | HK140904-1A |        |    0009     |
| RM001-01 | 2    | 1          |  2  | HK140904-1B |        |    0009     |
| RM001-01 | 3    | 2          |  3  | HK140904-1C |        |    0009     |
| RM001-01 | 4    | 3          |  4  | HK140904-1D |        |    0009     |
| RM001-01 | 5    | 4          |  5  | HK140904-1E |    2   |    0009     |
| RM001-01 | 6    | 5          |  2  | HK140904-1F |        |    0009     |
| RM001-01 | 7    | 6          |  3  | HK140904-1G |    1   |    0009     |
| RM001-01 | 8    | 7          |  3  | HK140904-1H |    3   |    0009     |
| RM001-01 | 9    | 8          |  4  | HK140904-1I |    1   |    0009     |
+----------+------+------------+-----+-------------+--------+-------------+

Если пользователь выбирает 3-ю запись в tbl_pattern, результат:

+----------+------+------------+-----+-------------+--------+-------------+
| order_no | code | disp_order | lvl | description | state  | supplier_id |
+----------+------+------------+-----+-------------+--------+-------------+
| RM001-01 | 1    | 0          |  1  | HK140904-1A |    2   |    0009     |
| RM001-01 | 2    | 1          |  2  | HK140904-1B |        |    0009     |
| RM001-01 | 3    | 2          |  3  | HK140904-1C |    3   |    0009     |
| RM001-01 | 4    | 3          |  4  | HK140904-1D |        |    0009     |
| RM001-01 | 5    | 4          |  5  | HK140904-1E |        |    0009     |
| RM001-01 | 6    | 5          |  2  | HK140904-1F |        |    0009     |
| RM001-01 | 7    | 6          |  3  | HK140904-1G |        |    0009     |
| RM001-01 | 8    | 7          |  3  | HK140904-1H |        |    0009     |
| RM001-01 | 9    | 8          |  4  | HK140904-1I |        |    0009     |
+----------+------+------------+-----+-------------+--------+-------------+

Столбец состояния автоматически устанавливается на '2', если он существует в tbl_parent

Ответы [ 2 ]

0 голосов
/ 02 октября 2018

Требование действительно трудно понять.Из того, что я вижу:

  1. Выберите одну запись из tbl_pattern.
  2. Возьмите все записи из tbl_main.Это CROSS JOIN.
  3. Если запись tbl_main соответствует записи tbl_pattern, а запись tbl_pattern соответствует строке в tbl_parent, тогда status равно 2.
  4. Если запись tbl_main плюс request_no записи tbl_pattern соответствует строке в tbl_child, то должен отображаться статус этой строки.

Одна из возможностей состоит в поиске статуса вSELECT пункт.

select 
  m.*, 
  p.supplier_id,
  case 
    when p.order_no = m.order_no 
    and p.code = m.code
    and p.disp_order = m.disp_order
    and p.lvl = m.lvl
    and p.description = m.description
    and (p.order_no, p.code, p.disp_order, p.lvl, p.description, p.request_no) in
    (
      select order_no, code, disp_order, lvl, description, request_no
      from tbl_parent
    ) then 2
    else
    (
      select state
      from tbl_child c
      where c.order_no = m.order_no
        and c.code = m.code
        and c.disp_order = m.disp_order
        and c.lvl = m.lvl
        and c.description = m.description
        and c.request_no = p.request_no
    )
  end as status
from tbl_pattern p
cross join tbl_main m
where p.order_no = 'RM001-01'
  and p.code = 1
  and p.disp_order = 0
  and ...;
0 голосов
/ 02 октября 2018

Если вы хотите выбрать все указанные ниже столбцы (F1.order_no, F1.code, F1.disp_order, F1.lvl, F1.description, F3.state, F1.supplier_id)

, то выдолжен написать все в групповом предложении.такие как: -

SELECT
F1.order_no,
F1.code,
F1.disp_order,
F1.lvl,
F1.description,
F3.state,
F1.supplier_id
FROM tbl_main F1
LEFT JOIN tbl_pattern F2
ON F1.order_no = F2.order_no
AND F1.code = F2.code
LEFT JOIN tbl_child F3
ON F1.order_no = F3.order_no
AND F1.code = F3.code

group by F1.order_no, F1.code, F1.disp_order, F1.lvl, F1.description, F3.state, F2.supplier_id, F3.request_id ;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...