Выберите значение столбцов на основе логи c, примененных к строкам - PullRequest
0 голосов
/ 31 марта 2020

Мне нужно самостоятельное объединение, но у меня возникли проблемы с этой проблемой, и я надеюсь, что кто-нибудь сможет мне помочь. У меня есть таблица с MAT_CODE, MATERIAL и VENDOR, и я пытаюсь создать новый столбец с NEW_MATCODE согласно приведенному ниже сценарию.

Пример данных:

NEW_MATCODE     MAT_CODE    MATERIAL        VENDOR      WIN_VENDOR
                            X-043223065     GP002134    GP002134
3065                        X-043223065     USD005      P10011
3065            3065        X-043223065     EUR003      P10011

4567            4567        X-023065        UD00005     UD00005
4567                        X-023065        DF00388     UD00005

4321                        X-04065         P24005      P24005
4321            4321        X-04065         D41111      P24005
4321                        X-04065         D46732      P24005

                            X-0432065       US7800      D0230005
                            X-0432065       EUR234      D067805

123             123         X-04322         P0008       P0008
123             1234        X-04322         EU0323      P0008
123             1262        X-04322         EUR0032     P0008

2345            2345        X-04322         DFGH322     P12008
123456          123456      X-04322         EUR00323    P12008
1113            1113        X-04322         EUR0032     P12008

Logi c для 1, 2 и 3 набора данных:
Подберите комбинацию MATERIAL и WIN_VENDOR, получите уникальный MAT_CODE и примените его ко всем комбинациям MATERIAL- WIN_VENDOR как NEW_MATCODE

Logi c для 4-го набора:
Если комбинация для MAT_CODE не существует, оставьте ее как есть

Logi c для 5-го набора:
Если существуют разные MAT_CODE для той же комбинации MATERIAL и WIN_VENDOR, примените NEW_MATCODE как MAT_CODE из МАТЕРИАЛ - VENDOR, где VENDOR = WIN_VENDOR

Logi c для 6-го набора:
Если для одной и той же комбинации MATERIAL и WIN_VENDOR существуют разные MAT_CODE, а VENDOR <> WIN_VENDOR оставить MAT_CODE без изменений.

Надеюсь, это понятно. Любая помощь будет оценена.
Спасибо.

1 Ответ

1 голос
/ 31 марта 2020

Я думаю, что следующий запрос даст вам большую часть пути к тому, что вы ищете:

SELECT mat_code, material, vendor, win_vendor, 
       CASE 
         WHEN COUNT(DISTINCT mat_code) OVER (PARTITION BY material, win_vendor) = 0 THEN mat_code
         WHEN COUNT(DISTINCT mat_code) OVER (PARTITION BY material, win_vendor) = 1 THEN MAX(mat_code) OVER (PARTITION BY material, win_vendor)
         ELSE NVL((SELECT sub.mat_code FROM material_info sub WHERE sub.material = mi.material AND sub.vendor = sub.win_vendor), mi.mat_code)
       END AS NEW_MAT
FROM material_info mi;

Оператор case использует аналитические функции для обработки случаев 1-4. Ветвь else пытается получить Случай 5, и если он не найден, по умолчанию Случай 6.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...